首页 文章

从const成员函数调用非const成员函数指针

提问于
浏览
0

我有以下代码:

class MyClass;
typedef void(MyClass::*func_ptr)();
class MyClass
{
public:

MyClass()
{
    f = &MyFunc1;
}

void MyFunc1()
{
    // ...
}

void MyFunc2() const
{
    (this->*f)();
}

func_ptr f;

};

如果我尝试编译,它会失败,因为MyFunc2()是一个const方法,试图调用类型为func_ptr的非const的函数指针 .

我正在试图找出最好的方法 . 我可以使用标准的C样式演员:

typedef void(MyClass::*func_ptr2)() const;
    func_ptr2 f2 = (func_ptr2)f;
    (this->*f2)();

但我更喜欢使用C cast(即static_cast,reinterpret_cast或const_cast) . 我用reinterpret_cast进行编译但是我无法使用const_cast . 我认为const_cast不适用于这种情况?另外,有没有更简洁的方法来创建另一个typedef吗?

3 回答

  • 2

    这段代码中有几个问题 .

    f = &MyFunc1;
    

    不是格式正确的C,因为获取非静态成员函数的地址需要完全限定的名称:

    f = &MyClass::MyFunc1;
    

    this 是const成员函数中的 MyClass const* . 您可能需要抛弃 const

    (const_cast<MyClass*>(this)->*f)();
    

    一个更好的解决方案可能是重新考虑设计,以避免与 const_cast 打击类型系统 .

  • 1

    典型的解决方案是 (const_cast<MyClass*>(this)->*f)(); .

    只要 MyClass 实例已创建为非const,这是合法的 . 否则,这将调用未定义的行为 .

  • 0

    以下似乎编译:

    MyClass()
    {
        f = &MyClass::MyFunc1;
    }
    
    void MyFunc1()
    {
        // ...
    }
    
    void MyFunc2() const
    {
        MyClass* mc = const_cast<MyClass*>(this);
        (mc->*f)();
    }
    

相关问题