为什么将成员函数指针与NULL进行比较会产生警告?

Iro*_*san 6 c++ android-ndk

对于Windows,Mac和iOS,以下代码编译时没有警告:

class MyClass {
    SomeOtherClass * m_object;
    void (SomeOtherClass::*m_callback)();
public:
    MyClass(SomeOtherClass * _object,void (SomeOtherClass::*_callback)()=NULL) :
        m_object(_object),m_callback(_callback) {}

    void DoStuff() {
        //generates warning: NULL used in arithmetic when compiling with the Android NDK
        if (NULL==m_callback) {
            m_object->DoNormalCallback();
        } else {
            (m_object->*m_callback)();
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

为什么会产生警告,我该怎么办呢?

And*_*ron 2

我认为您不允许与成员函数指针进行比较0(或NULL),特别是因为它们可能实际上不是指针(virtual例如,当函数是 时)。

就我个人而言,我会重写if测试而不进行比较,例如:

void DoStuff() {
    if (m_callback) {
        (m_object->*m_callback)();
    } else {
        m_object->DoNormalCallback();
    }
}
Run Code Online (Sandbox Code Playgroud)

并且,为了获得奖励积分,请在构造函数中执行此测试。

class MyClass {
    SomeOtherClass * m_object;
    void (SomeOtherClass::*m_callback)();
public:
    MyClass(SomeOtherClass * _object,void (SomeOtherClass::*_callback)()=NULL) :
        m_object(_object),m_callback(_callback)
    {
         // Use "DoNormalCallback" unless some other method is requested.
         if (!m_callback) {
             m_callback = &SomeOtherClass::DoNormalCallback;
         }
    }

    void DoStuff() {
        (m_object->*m_callback)();
    }
};
Run Code Online (Sandbox Code Playgroud)