2

我正在写 C#。我喜欢使用event. 我的班级很自然地只发布事件而不关心他们将处理谁以及如何处理。但是,由于我需要将代码迁移到 c++,我还应该使用event吗?将这样的代码重写为 C++ 有多容易?使用其他更容易重写为 c++ 的技术可能有意义吗?

upd在 C++、Composition 中发现了类似的问题 C#-like events

4

4 回答 4

2

.net 中的事件(包括 C#)只是对观察者设计模式的一种解释;这种相同模式的任何 C++ 实现都会有“相似”的行为。

编辑:一些关于主题的快速搜索链接:

于 2013-01-03T14:47:59.707 回答
1

使用什么代替c#事件来使代码易于移植到 c++?

如果您确定您的想法仅与event相关,那么我认为您无需进行任何更改。

只需为event编写一个底层类,即可达到您的目标。

你可能有各种方法可以做。第一步是考虑回调。

这里我提供了一些代码,例如,通过 P-invoke 调用 c++ 回调并在 c# 中包装到委托中。

导入回调:

[DllImport("devlink.dll")]
static extern int DLRegisterType2CallDeltas(uint pbxh,DLCALLLOGEVENT cb);

定义委托:

public delegate void DLCALLLOGEVENT(uint pbxh, StringBuilder info);

声明事件:

public event EventHandler<CallLogEventArgs> CallLogEvent;

包装要调用的事件:

DLRegisterType2CallDeltas(
    pbxHandle,
    (pbxh, info) => {
        lock(thisLock)
            if(
                default(EventHandler<CallLogEventArgs>)!=CallLogEvent
                &&
                pbxHandle==pbxh
                )
                CallLogEvent(this, new CallLogEventArgs(info));
    }
    );

你需要在 C++中做一些反转/反转的事情。但首先,为事件委托实现一个类会让你更接近完成你所要求的。

于 2013-01-03T14:58:46.697 回答
0

您可以使用 lambdas 和 std::function 在 C++11 中轻松实现事件。

于 2013-01-03T14:21:46.737 回答
0

如果有疑问,您总是可以直接回到 Windows API。查看事件等。http://msdn.microsoft.com/en-us/library/windows/desktop/ms686364(v=vs.85).aspx

我已经有好几年没有写过 c++ 了,但那时我很高兴地使用了这些。在.net 世界中,System.Threading 中有包装器,但在底层它们是相同的。

显然,我在这里假设您的目标是(并且将仍然是)Windows。这有点像大锤的方法,但我认为它是万无一失的。

于 2013-01-03T14:31:25.723 回答