我只是想問一下我的方法是錯誤的還是一種方法是正確的,并且可以做到。
在專案中,我有一個 hal 和幾種基于 Base 的 Dir。當我創建一些目錄時,我將 hal 傳遞給它,因為每個目錄都以自己的方式使用它。每個人也以自己的方式對大廳中的事件做出反應。所以我想使用回呼機制。有一次我只有一個特定的控制器,我改變它,洗掉它,然后創建另一個,此時我必須連接回呼。我用一種 dir 型別創建了一個解決方案,它作業正常。但是當我想使用幾個不同的目錄時選擇什么路徑,我可以轉換為基礎并在 Hal 中使用基礎,如下所示:
class Base;
class Hal
{
public:
void set_callback(void (Base::*callback)(int), Base* base)
{
m_callback = callback;
m_base = base;
}
void fun()
{
(m_base->*m_callback)(some_int);
}
private:
Base* m_base;
void (Base::*m_callback)(int);
};
#include "Hal.h"
class Base
{
public:
virtual void active() = 0;
virtual void foo(int variable) = 0;
};
class Dir : public Base
{
public:
Dir(Hal& hal)
: m_hal(hal)
{}
void active()
{
auto callback = &Dir::foo;
//add some casting?
m_hal.set_callback(callback, this);
}
void foo(int variable)
{
// some code
}
private:
Hal& m_hal;
};
也許我應該添加一個單獨的類來路由此類回呼?還是使用不同的機制?不幸的是,我在這個專案中沒有可用的功能庫/:
uj5u.com熱心網友回復:
一個類的成員函式指標不能轉換為另一個類的成員函式指標,即使這些函式看起來兼容。您可以使用抽象層來近似此轉換,例如使用 astd::function<void(Base*, int)>但無法使用強制轉換來實作。
但是,成員函式指標尊重多型性。實際呼叫的函式將取決于呼叫它的物件的動態型別。
你只需要通過&Bar::foo,也就是virtual。由于將使用覆寫呼叫Dir它Dir::foo。
更改為m_hal.set_callback(&Bar::foo, this);應該做你想做的事。
現場示例:https ://godbolt.org/z/fd8hsbanv
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/429037.html
下一篇:文本操縱器:字串位置移動
