1

クラスを定義しました

template <class T> class NodeMap {

NodeMap(int n, T defaultEntry = NULL);

virtual ~NodeMap();

T& operator[](const node& u);

...

}

nodetypeのオブジェクトをパラメーター type のオブジェクトにマップしますT

今、私は class を持ちたいと思っています。Matchingこれは本質的にNodeMap<node>. 便宜上、 や などのメソッドを追加したいと思いisProperMatching(Graph& G)ますmatch(node u, node v)Matchingから継承できますNodeMap<node>か? 固定のテンプレート パラメータを使用してテンプレート クラスを拡張することは可能ですか (そうであれば、それは良い考えですか)?

4

3 に答える 3

4

あなたが示したコードであなたが何をしているのかを教えてくれる限り、次の可能性があります:

  1. に特化NodemapしてT=node、必要な追加のメソッドを含めます。便宜上、typedef Nodemap<node>toを使用できますMatching。ただし、これにより、特殊化されていないテンプレートにあるメソッドのコードの重複が追加される可能性があります。
  2. Nodemap<node>あなたが提案したように派生します。Nodemap適切な基本クラスになるように設計する場合、これは有効なアプローチです。仮想デストラクタは、メソッドを仮想化する必要はまったくないかもしれませんが、すでにそれを行っていることを示唆しています。
  3. 可能であれば、派生または特殊化する必要がないように、追加機能を無料の関数として提供します。Nodemap<node>

最初の 2 つの混合アプローチを検討します: s とNodeMapBaseの共通機能を含む基本クラス テンプレート (私はそれを と呼びます) を作成し、対応する基本クラス テンプレートからテンプレートを派生させます(おそらく多くの機能を追加することなく)。から派生します。MSVC の標準ライブラリの実装を見れば、そこに多くのことがわかります。NodeMapMatchingNodeMapMatchingNodeMapBase<node>

于 2012-12-05T12:20:25.103 に答える
2

はい、一般的に使用されています。

class Matching : public NodeMap<node> {
    ...
};
于 2012-12-05T12:15:22.950 に答える
2

これは、 のインターフェイスがどのMatchingように見えるかによって異なります。まったく同じメソッドといくつかの便利なメソッドを提供したい場合は、それを継承できます

class Matching : public NodeMap<node> {...};

しかし、Matchingが ではない場合NodeMap<node>、つまり別のインターフェースを提供する場合は、集約としてのみ使用する必要があります。

class Matching {
private:
    NodeMap<node> matchingNodes;
public:
    // public interface of Matching
    bool isProperMatching(Graph& G);
    bool match(node u, node v);
    ...
};

ところで、このアドバイスはNodeMap、テンプレートであるかどうかに依存しません。

于 2012-12-05T12:22:30.593 に答える