2017-01-24 87 views
-1

在我main.cpp中隱含的功能我也有類似如下的內容:從調用派生類

void OnEventStart(int id) 
{ 
    // Do some stuff 
} 

這個功能是一個回調,它只是觸發(由主SDK,這是從)時一個事件發生了。

我現在有這個類:

class SomeClass { 
public: 
    void OnEventStart(int id); 
}; 

void SomeClass::OnEventStart(int id) 
{ 
    // Do some other stuff 
} 

現在我想觸發void SomeClass::OnEventStart(int id)沒有做這樣的事情:

SomeClass class; 
void OnEventStart(int id) 
{ 
    // Do some stuff 

    class.OnEventStart(id); 

    // AnotherClass.OnEventStart(id); 
    // Another.OnEventStart(id); 
} 

正如你可以想像,使用方法,這樣可以很容易弄亂初始函數/回調。

+1

我假設你想要使用的框架/ SDK直接調用你的成員函數?然後它取決於您正在使用的實際框架/ SDK的許多*。這可能不可能。但除非您告訴我們框架/ SDK以及如何使用它(使用[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)),否則我們無法告訴您。另請[請閱讀如何提出好問題](http://stackoverflow.com/help/how-to-ask)。 –

+2

恕我直言,如果你告訴我們你是如何做的話,這將有助於理解這個問題,而不僅僅是你不想做什麼 – user463035818

回答

1

你的問題不是很清楚,但我會假設如下:

  • 你有某種回調處理程序,需要一個void(*)(int)

在這種情況下,如果SomeClass是無狀態的,你可以簡單地使用lambda包裝:

my_framework_callback([]{ SomeClass{}.OnEventStart(id); }); 

如果我誤解你問的是什麼,這裏有一個不同的假設:

  • SomeClass和類似的類型是無狀態

  • 你很煩惱不得不實例化SomeClass只是爲了調用它的一個方法。

如果是這樣的話,你可以創建SomeClass當場臨時實例

void OnEventStart(int id) 
{ 
    SomeClass{}.OnEventStart(id); 
    AnotherClass{}.OnEventStart(id); 
    Another{}.OnEventStart(id); 
} 

如果您的問題,而不是...

「我有不同的類具有相同的接口,我想調用它們的所有函數「。

...然後一個可能的解決方案將是使用抽象基類提供.OnEventStart() = 0和存儲指針的std::vector到該基類。

std::vector<std::unique_ptr<MyAbstractClass>> handlers; 
void OnEventStart(int id) 
{ 
    for(auto& h : handlers) 
     h->OnEventStart(id); 
} 
+0

感謝您的回覆。對不起,問題不清楚,我在你的帖子的第二部分提到了你遇到的問題。這種方法是否會要求我實例化每個類(其中會有很多),然後對每個類繼續執行'handlers.push_back(class)'? – thefatshizms

+0

@thefatshizms:你可以用很多不同的方式做到這一點。如果您在編譯時知道所有類型,則可以使用元編程庫和編譯時間列表。如果你允許你的代碼的用戶添加更多的類型來滿足界面,你需要做你提到的,也許提供某種'register ()'函數。 –