我想弄清楚如何做到這一點。我有兩節課-
class Caller(){
//constructs Callee
void onEventFired(){
//need to call a function on an obj
//which I dont have access to here
//objptr->funcA
}
};
class Callee(){
//it has access to an instance of caller object
private:
void setup(){
std::unique_ptr objptr = make_unique<SampleClass>....
//create unique ptr of obj
//can pass the objptr to Caller through a
//separate function but probably not clean ??
}
};
事件鏈 - 呼叫者在其自己的構造程序中創建被呼叫者實體,隨后,被呼叫者的 setup 函式被呼叫,該函式創建 SampleClass 指標。稍后,當我想從 Caller 中呼叫 SampleClass 的 funcA 時,周期性事件開始啟動
一種方法是通過單獨的函式將原始 SampleClass 指標傳遞給 Caller 類,但理想情況下我不希望類 Caller 能夠訪問它。有沒有辦法使用一些回呼,我可以干凈地做到這一點。
uj5u.com熱心網友回復:
你的問題的動機有點弱,所以讓我們稍微加強一下。
假設它Caller接受那些想要在EVENT_FIRED發生時回呼的事情的注冊。所以,系統有這樣的東西:
//... initialize all callees
//... wait for event
switch (event) {
//...
case EVENT_FIRED:
//...
//callback all interested callees
Caller::instance().onEventFired();
break;
//...
default:
//...
break;
};
通常,您希望被呼叫者向Caller實體注冊自己,以便他們通過注冊的回呼獲得事件通知。
為了接受注冊,您將在呼叫者中使用某種容器來跟蹤它們。
class Caller {
public:
struct Callback {
virtual ~Callback () = default;
virtual void fire () = 0;
};
static Caller & instance () {
static Caller one;
return one;
}
template <typename CALLBACK, int EVENT>
void subscribe () {
std::unique_ptr<Callback> cb(std::make_unique<CALLBACK>());
callbacks_[EVENT].push_back(std::move(cb));
}
//...
void onEventFired () {
for (auto &cb : callbacks_[EVENT_FIRED]) cb->fire();
}
private:
typedef std::list<std::unique_ptr<Callback>> CallbackList;
std::unordered_map<int, CallbackList> callbacks_;
Caller () = default;
Caller (const Caller &) = delete;
Caller & operator = (Caller) = delete;
~Caller () = default;
};
在Caller現在實作了Callback介面,并且在安裝程序中使其注冊。
class Callee : public Caller::Callback {
public:
static void setup () {
Caller::instance().subscribe<Callee, EVENT_FIRED>();
}
void fire () { std::cout << "You're fired!\n"; }
};
在線試試吧!
uj5u.com熱心網友回復:
這里有 2 個參考文獻可能正是您要找的。 律師-客戶習語和密鑰模式。
“律師-客戶”習語是一種添加代理類的方法。代理類是需要訪問的類的朋友。[Callee] - [Proxy] - [Caller] 關系建立。
Pass-Key模式是一種比較簡單的解決問題的方法。主要思想與使用朋友關鍵字相同。然而,它使用類模板,植根于模板元編程。有關更復雜的用法,請查看此版本。(最后一個答案)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/389150.html
下一篇:將實體傳遞給庫函式時出錯
