0

私は分散アルゴリズムを設計しており、次のように機能を分離しました。

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

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

このように分離することの価値は、ピアのさまざまな実装 (tcp/ip ソケット、またはスレッドなど) にアルゴリズムを再利用できることです。

PeerId は Peer の実装に依存する可能性がありますが、MyDistributedAlgorithm は PeerId 型のキーを持つマップを格納する必要があるため、具象型でなければなりません。

私は C++ にかなり慣れていません。C では、この問題に対する私の解決策は、PeerId を void* として定義し、各 Peer 実装で必要に応じてキャストすることです。C++ でこれを行うより良い方法はありますか?

4

1 に答える 1

0

PeerId古典的な継承階層を作成できます。実際の派生クラスにはおそらくポインタがないため(実際には値であるため)、std::shared_ptr(または boost::shared_ptr、C ++ 11がない場合は)を使用するのがおそらく安全です。

PeerIdまたは、 (共有)ポインターをラップすることもできます。必要なインターフェースを提供し、実装を指し示すように転送します。

PeerIdここでは、(割り当てを除いて)不変であると想定しています。これは識別子の最も可能性の高いケースのようですが、そうでない場合は、上記の提案が期待値のセマンティクスではなく、リファレンスセマンティクスを実装しているという事実を考慮する必要があります。(不変オブジェクトでは、2つの違いを実際に区別することはできません。)

于 2013-02-04T17:22:07.003 に答える