繁体   English   中英

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

[英]Calling non-const member function pointer from const member function

我有以下代码:

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方法,试图调用非const的func_ptr类型的函数指针,它会失败。

我正在尝试找出最好的方式来投射它。 我可以使用标准的C样式转换:

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

但是我更喜欢使用C ++强制转换(即static_cast,reinterpret_cast或const_cast)。 我可以使用reinterpret_cast进行编译,但是不能与const_cast一起使用。 我以为const_cast不是要用于这种情况? 另外,是否有一种更清洁的方式来执行此操作而不必创建另一个typedef?

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

只要MyClass实例是非常量创建的,这是合法的。 否则,这将引发未定义的行为。

此代码中有两个问题。

 f = &MyFunc1;

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

 f = &MyClass::MyFunc1;

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

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

更好的解决方案可能是重新考虑设计,以避免与const_cast对抗类型系统。

以下内容似乎可以编译:

MyClass()
{
    f = &MyClass::MyFunc1;
}

void MyFunc1()
{
    // ...
}

void MyFunc2() const
{
    MyClass* mc = const_cast<MyClass*>(this);
    (mc->*f)();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM