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



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

遇到的问题:

    需要在类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来获取数据,常成员函数是可以调用静态变量和静态成员函数的,因为之前我说的一样,静态的就是类共有的.可以这么理解,静态的就是类里没啥地位的,谁都可以指唤 (调用)它们,而它们只能自己直接合作(调用).静态的只能调用静态的. 

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值