2017-01-24 12 views
-1

から暗黙的に関数を呼び出す:私は次のようなものを持っている私のmain.cppには派生クラス

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

この関数は、コールバックで、それはときにのみ(これはからあるメインSDKによって)トリガされますイベントが発生しました。これは簡単に乱雑することができますようにメソッドを使用して、

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

    class.OnEventStart(id); 

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

あなたが想像できるように:私はこのような何かをやってなくてvoid SomeClass::OnEventStart(int id)をトリガーにしたい今

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

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

は、私は今、このクラスを持っていますinital関数/コールバック。

+1

メンバ関数を直接呼び出すために使用しているフレームワーク/ SDKを使用したいと思いますか?それから、使用している実際のフレームワーク/ SDKには*たくさんの*がかかっています。それは可能ではないかもしれません。しかし、あなたが私たちにフレームワーク/ SDKを教え、それをどのように使っているかを(最小限で、完全で、検証可能な例で)(http://stackoverflow.com/help/mcve))、あなたに話すことはできません。また、[良い質問をする方法について読む](http://stackoverflow.com/help/how-to-ask)をご覧ください。 –

+2

私はあなたがそれをしたいと思っていない方法だけでなく、あなたがそれをしたいと思っているかどうか教えてください、それを理解するのに役立ちます – user463035818

答えて

1

あなたの質問は非常に明確ではありませんが、私は次のことを仮定します:

  • あなたはvoid(*)(int)を取るコールバックハンドラのいくつかの並べ替えを持っています。その場合

SomeClassはステートレスである場合、あなたは、単にラムダラッパーを使用することができます。

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

私はあなたが求めていたものを誤解している場合、ここでは異なる前提だ:

  • SomeClassおよび類似のタイプは、ステートレスです。

  • SomeClassをインスタンス化してそのメソッドの1つを呼び出すだけで、迷惑になります。その場合は、あなたがその場で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

返事をありがとう。ご不明な点がありましたら申し訳ありませんが、あなたの投稿の2番目の部分で対処している問題です。このメソッドでは、各クラスをインスタンス化する必要がありますか(たくさんあります)、すべての単一クラスに対して 'handlers.push_back(class) 'に進む必要がありますか? – thefatshizms

+0

@thefatshizms:これはさまざまな方法で行うことができます。コンパイル時にすべての型を知っているなら、メタプログラミングライブラリとコンパイル時のリストを使うことができます。あなたのコードのユーザがインタフェースを満たす型をさらに追加できるようにするには、あなたが言及したことをする必要があります。何らかの 'register ()'関数を提供する必要があります。 –

関連する問題