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

3

以下是我想要实现的一个例子以及具体步骤:

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和4)坚持实例应该是非const的?那么const_cast会引起问题吗?
FYI:instance并不一定是const,我只是不希望被调用者搞乱它。
这里发生了什么?
2个回答

7
错误出现在前一行。将 typedef 改为
typedef void (MyClass::*MemFunc)() const;

将其转变为指向常量成员函数类型。

考虑以下代码及其工作方式,可能会更加清晰:

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

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


0

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

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

MemFunc func = &MyClass::Dummy;

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

(instance->*func)();

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

您需要更改MemFunc的定义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接