2

我有几个复杂的类,它们是使用从要创建的类继承的单独的创建者类构造的。

一个示例可能是由无序数据构建的图。

class Graph{
  //....
  public:
   void showData(); 
  protected: 
    std::vector<std::pair<int,int> > mConnectedData;

}

class GraphCreator:private Graph{
  public:
    //...
    void construct();
  private:
   std::map<double,int> mSomeHelperContainer;
   //...
}

对于构造,我需要许多辅助函数和辅助数据,我将它们放在另一个类 GraphCreator 中。由于许多与图形相关的函数也是必需的,而且我在任何情况下都需要图形的数据,所以我使用私有继承。由于这绝不是著名的 is-a 关系,而且由于私有继承通常被认为是不良设计的暗示,我有一些疑问:这是一个好主意,是设计工厂的一种适当方式,还是有一些我认为的主要缺点?有没有想过?设计这样一个工厂的更好方法是什么?

编辑:

感谢您到目前为止的答案!一些附加信息,使当前使用的方法的原因更清楚。我不能使用静态创建方法(Creator 中的状态变量太多)并且我有另一个约束:我想在库中向其他人提供独立于创建者的 Graph(例如,连同从文件读取方法)。那些不应该关心创造者。因此我也有点不确定朋友的使用情况,因为它在 Graph 类中添加了代码。

4

2 回答 2

3

这不是一个好方法(从任何有数据的东西继承很少是)。

传统方法是:

  • GraphCreator一个friend_Graph
  • 将方法实现为(直接)中的static Build方法Graph

该决定主要取决于您是否需要“工厂”是有状态的。Aclass用于表示状态,这是方法无法做到的。

  • 因此,如果您需要 state,您需要 aclass来存储它,因此GraphCreator是您最好的选择。
  • 对于无状态方法,该static方法更轻量级。

如果您尚未决定,请选择最简单的(static方法),看看它走多远:)

于 2012-06-05T12:53:05.117 回答
2

我从这里采用的经验法则是

尽可能使用组合,必要时使用私有继承。

“你必须”的一个具体例子是,当你继承的类有一些你必须实现的虚函数或纯虚函数才能使用你的私有基时:你根本无法在没有继承的情况下做到这一点。

从您的描述来看,使用继承并不是不可避免的;因此,我认为最好使用组合。

于 2012-06-05T12:51:49.550 回答