定义了一个函数指针typedef void (*FuncTionCCP)(LONG,LONG); //定义一个函数指针类型
这个函数指针作为一个结构体的成员
typedef struct
{
LONG NextButtonID;
FuncTionCCP CcpDoAction;
}BT_CCP_BUTTON_ACTION;
class A
{
public:
static void B(LONG lWndID,LONG lEleID);
void C(LONG lWndID);
void Init();
void InitDialWndID(FuncTionCCP D);
}
void A:: B(LONG lWndID,LONG lEleID)
{
C(LONG lWndID;
}
void A:: Init()
{
InitDialWndID(B);
}
现在问题是:
函数B作为一个指针参数传给函数 InitDialWndID,因为函数B和 InitDialWndID是一个类的成员函数,所以C定义为静态的。C还需要调用这个类的另一个成员函数B,但是静态函数又不能调用非静态成员函数,
有什么解决办法。解决这个矛盾,求写出大致解决方案,谢谢了!!!!!!!!!!!!!!!
------解决思路----------------------
木有办法,重新设计
------解决思路----------------------
贴的代码比较乱。
1:
静态函数直接使用类成员,可以在静态函数的入参添加一个 static void SFun(void* _object);
然后将这个_object 转换为A * pthis = reinterpret_cast<A*>(_object )然后再通过pthis 调用。
也可以pthis ->MemFun(); 然后在MemFun里面调用所有的类成员;
2: C++ 11里面的 std::function 和 std::bind 代替回调函数;WINCE不知道支持不;
3、或者使用GOF的命令模型:
class Command
{
public:
virtual ~Command();
virtual void Execute() = 0;
virtual void UnExecute();
protected:
Command();
};
template <class Receiver>
class SimpleCommand : public Command
{
public:
typedef void (Receiver:: * Action)();
SimpleCommand(Receiver* r, Action a) : _receiver(r), _action(a){}
virtual void Execute(){
(_receiver->*_action)();
}
private:
Action _action;
Receiver* _receiver;
};
class Button
{
public:
void Click()
{
_BtnClick->Execute();
}
public:
Command* _BtnClick;
};
class Client
{
public:
Client()
{
_btn._BtnClick = new SimpleCommand<Client>(this, &Client::OnBtnClick);
}
//Receiver
void OnBtnClick()
{
cout<<"Client::OnBtnClick"<<endl;
}
void OnBtnClick2()
{
}
public:
Button _btn;
};
大概就这样;
MFC可以直接使用类成员函数作为回调是因为做了转换处理的:
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
#define ON_COMMAND(id, memberFxn) \
{ WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSigCmd_v, \
static_cast<AFX_PMSG> (memberFxn) },
typedef void (AFX_MSG_CALL CCmdTarget::*AFX_PMSG)(void);