我经常遇到一个问题,我的类有一对注册/取消注册类方法。例如:
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/