之前一直都不太注意静态成员函数和常成员之前的区别,直到要用带回调函数的时候,就悲剧了.
遇到的问题:
需要在类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来获取数据,常成员函数是可以调用静态变量和静态成员函数的,因为之前我说的一样,静态的就是类共有的.可以这么理解,静态的就是类里没啥地位的,谁都可以指唤
(调用)它们,而它们只能自己直接合作(调用).静态的只能调用静态的.
以上是我的理解,有错误请指点.