是否可以将成员函数替换为 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
我用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