2013-02-04 42 views
0

我设计的分布式算法,我已经如下分离的功能性: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++中有更好的方法吗?

回答

0

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

或者,您可以让PeerId包装(共享) 指针;提供必要的接口,并将其转发到指向的实现。

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

+0

你可以贬低你的解释吗?我不确定你的经典继承层次结构是什么意思(基类是什么,派生类是什么?)或者与指针有什么关系。 PeerId是不可变的。 – dschatz

+0

在这里可用的小空间中,我无法真正解释继承或多态。我建议你得到一个好的教学文本,比如_Programming:Principles and Practice Using C++ _(由Stroustrup编写)并研究它。继承是C++中的基本工具之一。 –

+0

对不起,我不清楚。我理解继承。我不知道你如何提出我在这里使用它。 – dschatz

相关问题