我正在设计分布式算法,我将功能分开如下:
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 ++中执行此操作?
答案 0 :(得分:0)
你可以使PeerId
成为经典的继承层次结构;以来
没有一个实际的派生类可能会有一个指针
(因为它们确实是值),使用std::shared_ptr
(或
boost::shared_ptr
,如果你没有C ++ 11)可能会
安全。
或者,您可以PeerId
换行(共享)
指针;为它提供必要的界面,并拥有它
转向指向实施。
我在这里假设PeerId
是不可变的(除了
分配)。这似乎是标识符最可能的情况,
但如果没有,你将不得不考虑这个事实
上面的建议实现了引用语义,而不是
期望值语义。 (使用不可变对象,你不能
真的说出两者之间的区别。)