大家好:我是一個經驗豐富的C#程序員試圖做的在C++的一些工作,我不知道這樣做的正確方法:C#程序員嘗試在C++事件
我創作一需要通知消費類的事情發生了。
如果我在c#中寫這個,我會在我的類上定義一個事件。
在C++中沒有事件,所以我想弄清楚什麼是正確的方法來做到這一點。我曾考慮過回調函數,但是如何處理我想執行成員函數(而不是靜態函數)的情況。
更具體地說,我真正需要做的是處理事件,但可以在處理事件的對象實例中訪問成員狀態。
我一直在尋找std :: tr1:函數,但我無法正常工作。
我不假設任何人都想將以下示例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();
}
}
}
[升壓信號](http://www.boost.org/doc/libs/1_51_0/doc/html/signals.html)。 –
@JerryCoffin:提升信號ANSI嗎? (這個代碼必須在Windows和Unix上編譯)。另外,你能告訴我一個例子嗎? – JMarsch
是的,Boost信號中的代碼非常便攜。我鏈接到的頁面包括[文檔/視圖示例](http://www.boost.org/doc/libs/1_51_0/doc/html/signals/tutorial.html#id3195532)。 –