c++ - 在 C++ 中实现注册/注销模式

标签 c++

我经常遇到一个问题,我的类有一对注册/取消注册类方法。例如:

class Log {
public:
    void AddSink( ostream & Sink );
    void RemoveSink( ostream & Sink );
};

这适用于几种不同的情况,例如观察者模式或相关内容。我担心的是,这有多安全?来自 previous question我知道,我无法从该引用中安全地派生对象标识。 This approach向调用者返回一个迭代器,它们必须传递给取消注册方法,但这会暴露实现细节(迭代器类型),所以我不喜欢它。我可以返回一个整数句柄,但这需要大量额外的内部管理(最小的空闲句柄是什么?)。你如何看待这件事?

最佳答案

除非客户端对象有两个 ostream 派生而不使用虚拟继承,否则你是安全的。

简而言之,这是用户的错——他们不应该以两种不同的方式多次继承一个接口(interface)类。

使用地址并完成它。在这些情况下,我采用指针参数而不是引用来明确表示我将存储地址。如果您决定采用 const 引用,它还可以防止可能启动的隐式转换。

   class Log {
   public:
       void AddSink( ostream* Sink );
       void RemoveSink( ostream* Sink );
   };

您可以创建一个在构造函数中调用 AddSink 并在析构函数中调用 RemoveSink 的 RAII 对象,以使该模式异常安全。

关于c++ - 在 C++ 中实现注册/注销模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1881200/

相关文章:

c++ - 在 C++ 中更改基类值

c++ - 允许通过不同维度进行迭代的二维 map 类数据结构

java - 无法在 Java/C++ 中为外部应用程序设置永远在线

c++ - 离散对数暴力破解 : Can someone explain me the runtime differences between C++ and C++ with NTL?

c++ - LNK2001 : unresolved external symbol _MyClass. cpp

c++ - C++中如何从数组的数组中获取数组的大小

java - 使用 Java 进行 Android QT 开发 - 替代方案?

c++ - 为什么我的基于 C++ Clock() 的函数返回负值?

c++ - 延迟crtp基类中的成员函数实例化

java - 在多项式方程中合并相似项