C++函数指针(二)

上一篇说道了用强制转换绕过限制,还有些不甘心,这使用起来也太麻烦了,还有一大堆强转。

刚刚看了一下宏的用法,发现可以用宏定义来简化操作。

#define _OBJECT(classname) \
public: \
typedef void (classname##::*pFun##classname)(string); \
virtual bool Register(A* obj, pFun##classname function); \
public: \
pFun##classname m_pfun##classname;

#define _IMPLEMENT(classname) \
bool classname##::Register(A*obj, pFun##classname function) \
{ \
int* ptemp_fun= (int*)&function; \
obj->m_pfunA= *(A::pFunA*)ptemp_fun; \
return true; \
}


class A
{
_OBJECT(A)
public:
};
_IMPLEMENT(A)


class B: public A
{
_OBJECT(B)
public:
B(string b, int ib)
{
m_b= b;
m_ib= ib;
}


void testFunB(string str)
{
cout<<m_b<<":"<<m_ib<<";"<<"B类函数:"<<str<<endl;
return;
}
private:
string m_b;
int m_ib;
};
_IMPLEMENT(B)


class C:public A
{
_OBJECT(C)
public:
C(string c)
{
m_c= c;
}

void testFunC(string str)
{
cout<<m_c<<";"<<"C类函数:"<<str<<endl;
return;
}
private:
string m_c;
};
_IMPLEMENT(C)


但是_IMPLEMENT这个宏定义破坏了封装性原则,不过使用起来倒还方便

C *c= new C("我是C");
B *b= new B("我是B", 1);
b->Register(c, &B::testFunB); 
(c->*(c->m_pfunA))("c调用a的函数指针");


这个函数指针有个很不好的问题,就是不能使用成员变量,由于函数在code区,而成员在栈中,这就使得我们使用函数指针仅仅是使用code区的东西,而在找成员的时候找不到(这很正常,C中没有B的成员),就会使程序崩溃,所以说还是相当不安全的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值