当前位置: 代码迷 >> WinCE >> C++静态函数指针调用解决办法
  详细解决方案

C++静态函数指针调用解决办法

热度:123   发布时间:2016-04-28 11:57:07.0
C++静态函数指针调用
定义了一个函数指针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);

  相关解决方案