こんにちは。私は経験豊富な c# プログラマーで、c++ でいくつかの作業を行おうとしていますが、これを行う正しい方法がわかりません。
何かが起こったことを消費クラスに通知する必要があるクラスを作成しています。
これを C# で記述している場合は、クラスでイベントを定義します。
C ++にはイベントがないため、これを行う正しい方法を見つけようとしています。コールバック関数は考えましたが、メンバー関数(静的関数ではない)を実行したい場合はどうすればよいですか。
より具体的には、私が実際に行う必要があるのは、イベントを処理することですが、イベントを処理しているオブジェクト インスタンス内のメンバー状態にアクセスできるようにすることです。
std::tr1:function を見てきましたが、うまく動作しません。
次の例の c# の例を正しい/ベスト プラクティスの c++ の例に変換したいと思う人はいないと思います (ANSI c++ が必要です)。(私は C++ の経験がほとんどないことを覚えておいてください -- 私が長い間確立された C++ の慣習を知っていると仮定しないでください -- 私は知りません ;);
シンプルな c# コンソール アプリ (私のマシンで動作します):
using System;
namespace ConsoleApplication1
{
public class EventSource
{
public event EventHandler<EchoEventArgs> EchoEvent;
public void RaiseEvent(int echoId)
{
var echoEvent = this.EchoEvent;
if (echoEvent != null)
echoEvent(this, new EchoEventArgs() {EchoId = echoId});
}
}
public class EchoEventArgs : EventArgs
{
public int EchoId { get; set; }
}
public class EventConsumer
{
public int Id { get; set; }
public EventConsumer(EventSource source)
{
source.EchoEvent += OnEcho;
}
private void OnEcho(object sender, EchoEventArgs args)
{
// handle the echo, and use this.Id to prove that the correct instance data is present.
Console.WriteLine("Echo! My Id: {0} Echo Id: {1}", this.Id, args.EchoId);
}
}
internal class Program
{
private static void Main(string[] args)
{
var source = new EventSource();
var consumer1 = new EventConsumer(source) { Id = 1 };
var consumer2 = new EventConsumer(source) { Id = 2 };
source.RaiseEvent(1);
Console.ReadLine();
}
}
}