C++ 静态成员函数 静态成员变量 常成员函数之前的使用

来源:互联网 发布:软件工程项目案例 编辑:程序博客网 时间:2024/06/04 19:18


  之前一直都不太注意静态成员函数和常成员之前的区别,直到要用带回调函数的时候,就悲剧了.

遇到的问题:

    需要在类A中跟新行情数据的map,之前设计的是行情数据每秒查询一次,这样数据多起来以后对行情服务器造成很大压力,改成选择订阅的方式来跟新本地数据,提高运行效率,缓解行情压力.订阅就需要注册回调函数.


    一开始我用了单例模式的方法解决:把类内定义一个static 对象 m_gInstance,定义一个static的函数Recive_CALLBACK,注册这个函数到回调中,Recive_CALLBACK中调用m_gInstance对象来改变成员map的数据.

<span style="font-size:24px;">#include <map>struct m_struct{int code;int price;};class StaticTest{public:static StaticTest* m_gInstance;std::map<int,m_struct</span><span style="font-size:24px;">> Last_maps;static void Recive_CallBack(const m_struct& stru);StaticTest();~StaticTest();};CPP:StaticTest* m_gInstance = new StaticTest;void StaticTest::Recive_CallBack(const m_struct & stru){m_gInstance->Last_maps[stru.code] = stru;}StaticTest::StaticTest(){}StaticTest::~StaticTest(){}</span>
用一个static对象来解决静态和非静态之前的交流.还是挺好用的.就是我不想用单例模式,还得初始化对象啥的;于是我想静态函数不能调用常成员变量.非静态成员都是类的,而常成员是属于对象的,对象可以千千万,类只有一个,你让静态函数去调用一个成员变量,那肯定得告诉它是调用的哪一个对象的,要不它哪知道是谁的变量啊,找不到啊.

   我觉得在设计上,要用到静态函数的话,那么它应该是所有对象可以共享的一个东西,静态成员变量也应该是所有对象都共享的变量.而我遇到的问题中的行情刚好也是所有对象共享的.独一份,大家一起用,于是我就把map变成静态的,并且觉得它本来就应该是静态的,于是代码变成这样:

#include <map>struct m_struct{int code;int price;};class StaticTest{public:static std::map<int, m_struct> Last_maps;static void Recive_CallBack(const m_struct& stru);int GetLastPrice(const int code, m_struct &stru);StaticTest();~StaticTest();};CPP:#include "StaticTest.h"std::map<int, m_struct> StaticTest::Last_maps;void StaticTest::Recive_CallBack(const m_struct & stru){Last_maps[stru.code] = stru;}int StaticTest::GetLastPrice(const int code, m_struct & stru){auto iter = Last_maps.find(code);if (iter != Last_maps.end()){stru = iter->second;}else{return -1;}return 0;}StaticTest::StaticTest(){}StaticTest::~StaticTest(){}
用静态成员函数和变量来更新我的数据,用常成员函数GetLastPrice来获取数据,常成员函数是可以调用静态变量和静态成员函数的,因为之前我说的一样,静态的就是类共有的.可以这么理解,静态的就是类里没啥地位的,谁都可以指唤(调用)它们,而它们只能自己直接合作(调用).静态的只能调用静态的. 

    以上是我的理解,有错误请指点.


0 0
原创粉丝点击