在封装Socket时回调函数,static成员的冲突,望不吝赐教解决方案
在封装Socket时回调函数,static成员的冲突,望不吝赐教
刚从C++Builder转到VC,请多多指点!
★ 在使用C++Builder时,往往感觉到其强大丰富的组件给开发
带来的便利:
如在使用Socket组件时,你可以拖一个TServerSocket(假
设名为ServerSocketTest)组件到一个Form(假设名为TFormTest)
上,并定义选择的事件(假设为OnAccept事件)。这时在TFormTest
的.h文件和.cpp文件分别生成如下代码:
.h
class TFormTest
{
...
TServerSocket* ServerSocketTest;
void __fastcall ServerSocketTestAccept(...);
...
};
.cpp
...
void __fastcall TFormTest::ServerSocketTestAccept(...)
{
}
对此我的理解(如果有错,万分感激给我指点)是:
TFormTest::ServerSocketTestAccept()是一个
回调函数,它的地址将被传给ServerSocketTest::OnAccept,然后
在适当的时候被应用程序或其他程序调用。
★ 而在MFC(本人刚学)中,我只会继承CSocket进行网络编程,比如
对于一个继承自CSocket的类
class CServerSocket1 : public CSocket{};
如果我定义了它的OnReceive事件CServerSocket1::OnReceive(){},
那么对于用CServerSocket1声明的每一个对象
如CServerSocket1 sk1, sk2;
它们的OnReceive无疑问都千篇一律。若要各有不同的OnReceive,
我第一个想法就是再定义CServerSocket2 : public CSocket{};
然后定义CServerSocket2::OnReceive()事件,最后声明:
CServerSocket1 sk1; CServerSocket2 sk2;
于是sk1,sk2有不同的OnReceive。(^o^比BCB要麻烦)
★ 深感不便和困惑,于是我用VC在CSocket的基础上封装了自己的
Socket:
CLanSocketServer(对应BCB的TServerSocket),和
CLanSocketClient(对应BCB的TClientSocket)
封装后几乎实现了TServerSocket和TClientSocket一样的功能。
然而正高兴之余发现了问题:
我的Socket当然会用到回调,而如果回调函数又是一个类的
成员函数,如:
class CMyDlg : public CDialog
{
...
CLanSocketServer *m_pSocket;
void CALLBACK m_pSocketOnAccept();//m_pSocket的OnAccept回调
...
};
因为回调函数是类成员
于是只得修改如下:
class CMyDlg : public CDialog
{
...
CLanSocketServer *m_pSocket;
static void CALLBACK m_pSocketOnAccept();
...
};
回调函数注册及其它我都封装好了的,用户不用管,只管定义回调函
数(事件响应)就是
但是,由于m_pSocketOnAccept()是static类型的,所以它不能访问
CMyDlg的非静态成员, 如
class CMyDlg : public CDialog
{
public:
...
CLanSocketServer *m_pSocket;
static void CALLBACK m_pSocketOnAccept();
刚从C++Builder转到VC,请多多指点!
★ 在使用C++Builder时,往往感觉到其强大丰富的组件给开发
带来的便利:
如在使用Socket组件时,你可以拖一个TServerSocket(假
设名为ServerSocketTest)组件到一个Form(假设名为TFormTest)
上,并定义选择的事件(假设为OnAccept事件)。这时在TFormTest
的.h文件和.cpp文件分别生成如下代码:
.h
class TFormTest
{
...
TServerSocket* ServerSocketTest;
void __fastcall ServerSocketTestAccept(...);
...
};
.cpp
...
void __fastcall TFormTest::ServerSocketTestAccept(...)
{
}
对此我的理解(如果有错,万分感激给我指点)是:
TFormTest::ServerSocketTestAccept()是一个
回调函数,它的地址将被传给ServerSocketTest::OnAccept,然后
在适当的时候被应用程序或其他程序调用。
★ 而在MFC(本人刚学)中,我只会继承CSocket进行网络编程,比如
对于一个继承自CSocket的类
class CServerSocket1 : public CSocket{};
如果我定义了它的OnReceive事件CServerSocket1::OnReceive(){},
那么对于用CServerSocket1声明的每一个对象
如CServerSocket1 sk1, sk2;
它们的OnReceive无疑问都千篇一律。若要各有不同的OnReceive,
我第一个想法就是再定义CServerSocket2 : public CSocket{};
然后定义CServerSocket2::OnReceive()事件,最后声明:
CServerSocket1 sk1; CServerSocket2 sk2;
于是sk1,sk2有不同的OnReceive。(^o^比BCB要麻烦)
★ 深感不便和困惑,于是我用VC在CSocket的基础上封装了自己的
Socket:
CLanSocketServer(对应BCB的TServerSocket),和
CLanSocketClient(对应BCB的TClientSocket)
封装后几乎实现了TServerSocket和TClientSocket一样的功能。
然而正高兴之余发现了问题:
我的Socket当然会用到回调,而如果回调函数又是一个类的
成员函数,如:
class CMyDlg : public CDialog
{
...
CLanSocketServer *m_pSocket;
void CALLBACK m_pSocketOnAccept();//m_pSocket的OnAccept回调
...
};
因为回调函数是类成员
于是只得修改如下:
class CMyDlg : public CDialog
{
...
CLanSocketServer *m_pSocket;
static void CALLBACK m_pSocketOnAccept();
...
};
回调函数注册及其它我都封装好了的,用户不用管,只管定义回调函
数(事件响应)就是
但是,由于m_pSocketOnAccept()是static类型的,所以它不能访问
CMyDlg的非静态成员, 如
class CMyDlg : public CDialog
{
public:
...
CLanSocketServer *m_pSocket;
static void CALLBACK m_pSocketOnAccept();