具有多个实现的C ++具体类型

时间:2013-02-04 17:12:59

标签: c++

我正在设计分布式算法,我将功能分开如下:

class Peer {
public:
  void send(PeerId destination, ...) //send some data
}

class MyDistributedAlgorithm {
public:
  MyDistributedAlgorithm(Peer& self);
  doX(); //calls self.send()
}

以这种方式分离它的价值在于我可以将算法重用于Peer的不同实现(tcp / ip套接字或线程等)

我意识到PeerId可能依赖于Peer的实现,但MyDistributedAlgorithm需要存储一个PeerId类型的键的映射,因此它必须是具体的类型。

我在C ++方面相当缺乏经验,在C中,我对此问题的解决方案是将PeerId定义为void *,并根据需要为每个Peer实现强制转换它。有没有更好的方法在C ++中执行此操作?

1 个答案:

答案 0 :(得分:0)

你可以使PeerId成为经典的继承层次结构;以来 没有一个实际的派生类可能会有一个指针 (因为它们确实是值),使用std::shared_ptr(或 boost::shared_ptr,如果你没有C ++ 11)可能会 安全。

或者,您可以PeerId换行(共享) 指针;为它提供必要的界面,并拥有它 转向指向实施。

我在这里假设PeerId是不可变的(除了 分配)。这似乎是标识符最可能的情况, 但如果没有,你将不得不考虑这个事实 上面的建议实现了引用语义,而不是 期望值语义。 (使用不可变对象,你不能 真的说出两者之间的区别。)