如何使用指向常量对象的指针调用成员函数指针?

时间:2009-03-11 16:05:35

标签: c++

这是我想要完成的一个例子以及如何:

class MyClass
{
     public: 
         void Dummy() const{}

};
typedef void (MyClass::*MemFunc)();

void  (const MyClass * instance)
{
     MemFunc func=&MyClass::Dummy;
     // (instance->*func)(); //gives an error
         (const_cast<MyClass *>instance->*func)(); // works
}

为什么编译器(gcc 3&amp; 4)坚持认为实例应该是非const的?那个const_cast会导致问题吗?

仅供参考:实例`不一定是常量,我只是不希望被调用者弄乱它。

这里发生了什么?

2 个答案:

答案 0 :(得分:7)

错误在之前的行中。将typedef更改为

typedef void (MyClass::*MemFunc)() const;

使其成为指向const成员函数类型的指针。

在考虑此代码及其工作原理时,差异可能会更明显:

typedef void FunctionType() const;
typedef FunctionType MyClass::*MemFunc;

特别是成员函数指针实际上只是成员指针的一个特例。对于const成员函数,成员函数的函数类型与非const成员函数的函数类型不同。这就是类型必须匹配的原因。

答案 1 :(得分:0)

  
    

typedef void(MyClass :: * MemFunc)();

  

在这里,您要定义一个指向可能修改其对象的函数的指针。

  
    

MemFunc func =&amp; MyClass :: Dummy;

  

在这里,您要分配一个不会将其对象更改为此类指针的函数。这是合法的,因为不会更改的一个子集可能会更改

  
    

(实例 - &GT * FUNC)();

  

在这里,您尝试使用无法更改的对象调用可能更改其对象的函数。

您需要更改MemFunc的定义