C++的类成员函数的思考,static,类成员函数指针。

本文探讨了C++中类成员函数的调用方式及其与实例的关系,特别是在使用静态成员函数作为回调函数时如何避免对特定实例的依赖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.如果采取实例化,然后,在调用这个成员函数的时候总是带上实例的名字调用,我觉得这很不科学,否则每次改变实例的名字,调用函数的时候也要跟着改变。

2.

class a

{

public:

    void ss();

}

void tt()

{

    ss(); 

}

void ss()

{

    while(1);

}

int main()

{

    tt(); //不会出错,但是调用的ss并不是类成员函数ss。要注意是否是类成员函数。一个函数的定义带不带::差别是很大的。

}

3.要达到的目的是,封装到一个类里面的同时,做到不依赖某个固定的实例。或者做到尽量少依赖,定义一个实例,

只使用一次实例的名字。

4.void Websocket::on_message(server* s, websocketpp::connection_hdl hdl, message_ptr msg) {
   /* std::cout << "on_message called with hdl: " << hdl.lock().get()
              << " and message: " << msg->get_payload()
              << std::endl;*/


//::SendMessage(AfxGetMainWnd()->m_hWnd,WM_CLOSE,0,-1); 

readStrJson(msg->get_payload()); 

1>d:\llz\kl_wlserver\kl_wlserver\websocket.cpp(43) : error C2352: 'Websocket::readStrJson' : illegal call of non-static member function

可以看出,在一个成员函数的定义内容里面,所有不指名域的函数也都会被冠以该类的域。

因为on_message是static型的,所以readStrJson也应该是static型的。

5.最后问自己一遍,为什么要加static。

首先,如果我使用了回调函数,传给回调函数的参数是类成员函数,可以采取两种做法:第一就是实例化了之后,传入该实例对应的成员函数的地址,(比如,Websocket.aa),第二就是,直接&Websocket::aa,但是,aa在声明的时候要加static。

为了减少对实例的依赖,我采取了第二种做法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值