天天看点

关于函数指针调用C++非静态成员

        当在类里面定义函数指针,而函数指针会指向类里面的成员的时候,这个时候成员需要定义为静态成员。实例代码如下:

                                   //.h

#define SCMD_REGISTER 0

class CCallFuctionList

{

public:

CCallFuctionList();

virtual ~CCallFuctionList(void);

typedef void (* FUNCPTR)();

typedef std::multimap<unsigned int, FUNCPTR> FUNCMAP;

typedef std::multimap<unsigned int, FUNCPTR>::iterator FUNCMAP_ITERATOR;

static void CallDoRegister();

private:

static int i;

static FUNCMAP_ITERATOR m_funcIter;

FUNCMAP m_FuncMap;

};

//.cpp

int CCallFuctionList::i = 0;

CCallFuctionList::FUNCMAP_ITERATOR CCallFuctionList::m_funcIter = NULL;

CCallFuctionList::CCallFuctionList()

{

#define REGISTE_FUNC(type, func) m_FuncMap.insert(std::make_pair(type, func))

REGISTE_FUNC(SCMD_REGISTER, CallDoRegister);

REGISTE_FUNC(SCMD_REGISTER, CallDoRegister);

}

void CCallFuctionList::CallDoRegister()

{

i = -1;

(m_funcIter->second)();

}

          静态函数里面调用的所有类成员都需要设置为静态!你肯定想不就全改成静态的就完了,但静态变量都需要初始化,且静态函数里面调用了静态的Vetor初始化起来比较麻烦,还有种方式,通过一种方式使函数指针调用c++非静态函数。

          代码如下:

                                   class CCallFuctionList

{

public:

CCallFuctionList();

virtual ~CCallFuctionList(void);

typedef void (CCallFuctionList::*FUNCPTR)();

typedef std::multimap<unsigned int, FUNCPTR> FUNCMAP;

typedef std::multimap<unsigned int, FUNCPTR>::iterator FUNCMAP_ITERATOR;

void CallDoRegister();

private:

FUNCMAP_ITERATOR m_funcIter;

FUNCMAP m_FuncMap;

int i;

};

CCallFuctionList::CCallFuctionList()

{

#define REGISTE_FUNC(type, func) m_FuncMap.insert(std::make_pair(type, func))

REGISTE_FUNC(SCMD_REGISTER, &CCallFuctionList::CallDoRegister);

REGISTE_FUNC(SCMD_REGISTER, &CCallFuctionList::CallDoRegister);

}

void CCallFuctionList::CallDoRegister()

{

i = -1;

(this->*m_funcIter->second)();

}

         传this指针进去,是因为函数指针调用时,默认并没将this传进去,需要自己手动传!