1

我已经定义了一个类

template <class T> class NodeMap {

NodeMap(int n, T defaultEntry = NULL);

virtual ~NodeMap();

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

...

}

它将一个类型的对象映射node到一个参数类型的对象T

现在我想要一个类Matching,它本质上是一个NodeMap<node>. 为方便起见,我想添加isProperMatching(Graph& G)和之类的方法match(node u, node v)。可以Matching继承自NodeMap<node>?是否可以(如果可以,这是一个好主意)扩展具有固定模板参数的模板类吗?

4

3 回答 3

4

就您显示的代码而言,您有以下可能性告诉我您在做什么:

  1. 专门Nodemap用于T=node, 以包含您想要的其他方法。为方便起见,您可以随后 typedefNodemap<node>Matching. 但是,这可能会添加您在非专业模板中的方法的一些代码重复。
  2. Nodemap<node>按照您的建议派生。这是一种有效的方法,如果您Nodemap以一种使其成为适当的基类的方式进行设计。虚拟析构函数建议您已经这样做了,尽管可能根本不需要将方法设为虚拟。
  3. 如果可能,将附加功能作为免费功能提供,因此无需派生或专门化Nodemap<node>

NodeMapBase我会考虑前两种的混合方法:制作一个包含NodeMaps 和的通用功能的基类模板(我称之为) Matching,然后NodeMap从相应的基类模板派生模板(可能不添加太多功能)和源自. Matching_ NodeMapBase<node>如果您查看 MSVC 的标准库实现,您会看到很多。

于 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> {...};

但是如果Matchingis not a NodeMap<node>, ie 提供不同的接口,你应该只使用它作为一个聚合

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 回答