2010-12-16 4 views
3

ここ数ヶ月間、私はC#をたくさん使っていて、イベントやデリゲートに慣れてきました。そのクラスでコンポーネントを使用するのはとても簡単ですが、イベントを使用してコンポーネントからメッセージを取得するだけです...今ではC++で同様のことをやろうとしています。C++でのC#のようなイベント、コンポジション

C++での合成はどのように行われますか?私の心に来る唯一の方法は継承です...クラスから派生し、その関数をオーバーライドしてその入力を受け取りますか?他に簡単な(良い)方法はありますか?

さらに...私はこのような再利用可能なコンポーネントを書きたい... C++で

public delegate void OnDataReceivedHanlder(byte[] data); 
public class TcpConnection 
{ 
    public void Connect(string iP, ushort port); 
    public void Send(byte[] data); 
    public event OnDataReceivedHandler OnDataReceived;  
} 

を説明するために...

答えて

4

通常、これには継承(動的または静的)を使用します。代わりに、std::function< return(args..) >を使用するだけで、関数オブジェクト、関数ポインタ、ラムダ関数などの多くの選択肢にバインドできます。

4

はい、boost::signals2を見てみましょう。ブースト信号を使用して、C#のイベントと同様に、信号を複数のスロットに接続することができます。私がリンクしているページのチュートリアルや例が参考になるはずです。

+0

例としてTcpConnectionクラスを作成しました... – rusbi

+0

私の間違いは、実際には。私がソケットと呼ぶものは、実際にはスロットです。私は英語のネイティブスピーカーではないので、私は2つを混同しました。彼らはネットワーキングとは関係がありません。間違いを修正しました。 – fingerprint211b

+0

どちらでもない:) Tnxとにかく... – rusbi

0

私はC++で組成物の三つの方法を考えることができます(private継承に似たデリゲートメンバーを追加し、+/-)

  1. 集約 - >好まれます。
  2. 公開継承、
  3. 実際に複雑な構造の場合はcomposite Design Patternを使用します。
+0

集約と合成が同じではない – Incubbus

+0

集約は作曲の唯一の方法です。他にもあります。 C++の優れたコーディング実践は、集約を通じて構成を優先します。 cf. Sutter Alexandrescu - http://www.amazonの「C++コーディング標準:101のルール、ガイドライン、ベストプラクティス」fr /コーディング標準 - 規則 - ガイドライン - 慣行/ dp/0321113586 –

+0

http://en.wikipedia.org/wiki/Object_composition –

0

FastDelegatesも見てください。

"[代理人]は、アセンブリコードでは簡単に実装できない高水準の概念であると想像しても過言ではありません。 C++のデリゲートにはthisポインタと単純な関数ポインタが必要です。 "ここで

2

は、あなたのC#のコードと同等です:

class TcpConnection 
{ 
public: 
    void Connect(const std::string& iP, unsigned port); 
    void Send(const std::vector<unsinged char>& data); 
    std::function<void (const std::vector<unsinged char>&)> OnDataReceived; 
}; 

のstd ::機能とラムダ関数C++ 0xの(より強力)は、C#のデリゲートに等価物です。スレッドとファイバー、および同期イベントハンドラと非同期イベントハンドラを備えたより複雑なマルチキャスト機能が必要な場合は、GBL library(イベントドリブンデザインをグラフィカルに作成することができ、C++コードが生成されるため、手で)。

+0

これは有望です...どのように私はVS2008の下でこれを使うことができますか? – rusbi

+0

C#のstd :: functionに相当するのは実際には匿名メソッドですが、C#のlambdasと同等のものはlambdaでもありますので、匿名メソッドはデリゲートを使って実装されていますが、必須ではなく、C++の例は同じ方法で動作しないためにOPによって作成されたC#の例は、近いが同等ではない可能性があります。 –

関連する問題