是否可以将成员函数替换为 noop 函数?

Is it possible to replace member function to a noop function?

我用c++11写c++,有一个问题作为标题。

例如

class Hi {
public:
Hi(){};
test() {cout << "test" << endl;};
}

void noop(){
; // noop
};

int main(){
 Hi hi();
 hi.test = noop; // just example, not real case

 return 0;
}

是否可以将 class Hi 的 test() 替换为运行时的 noop 函数!?谢谢

您不能在运行时替换任何函数,无论是否 class 成员。

不过,您可以通过使用变量来达到预期的效果。
(这是解决问题的“添加间接级别”方法的又一示例。)

示例:

class Hi {
public:
    Hi(): test([this]() { do_test(); }) {}
    std::function<void()> test;
    void do_test() { cout << "test" << endl; }
};

void noop(){}

int main(){
 Hi hi;
 hi.test(); // Outputs 'test'
 hi.test = noop;
 hi.test(); // Does nothing
}

你必须考虑面向对象。在这种情况下,您必须将您的函数提升为我们可以将其命名为 MethodClass 的对象,然后您在 class Hi 中的函数将成为指向该 class 的指针。下面是一个简单的例子

#include <memory>

class BaseMethodClass
{
public:
    virtual void method() = 0;
};

class MethodClass1 : public BaseMethodClass
{
public:
    virtual void method() 
    { 
        // your implementation here 
    }
};

class MethodClass2 : public BaseMethodClass
{
public:
    virtual void method() 
    { 
        // your implementation here
    }
};
        
class Hi 
{
public:
    Hi() { method = nullptr; };

    void setMethod(BaseMethodClass* m) { method.reset(m); }

    void test() { if (method) method->method(); };

private:
    std::shared_ptr<BaseMethodClass> method;
};

int main() 
{
    Hi hi;
    hi.setMethod(new MethodClass1());
    hi.test();
    hi.setMethod(new MethodClass2());
    hi.test();

    return 0;
}

通过这种方式,您可以根据需要覆盖您的方法,而不仅仅是 noop