我用 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;
}
是否可以在運行時將 Hi 類的 test() 替換為 noop 函式!?謝謝。
uj5u.com熱心網友回復:
您不能在運行時替換任何函式,無論是否是類成員。
但是,您可以通過使用變數來達到預期的效果。
(這是解決問題的“添加間接級別”方法的另一個示例。)
例子:
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
}
uj5u.com熱心網友回復:
你必須考慮面向物件。在這種情況下,您必須將您的函式提升為一個物件,我們可以將其命名為 MethodClass,然后您在 Hi 類中的函式將是指向該類的指標。下面是一個簡單的例子
#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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/469972.html