我有几个复杂的类,它们是使用从要创建的类继承的独立创建者类构建的。
一个例子可能是从无序数据构建的图。
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类中添加了代码。
答案 0 :(得分:3)
这不是一个好方法(从数据很少的任何东西继承)。
传统方法是:
GraphCreator
friend
Graph
static
(直接)Build
Graph
方法
决定主要取决于你是否需要“工厂”是有状态的。 class
用于表示状态,方法无法做到。
class
来存储它,因此GraphCreator
是您最好的选择。static
方法更轻量级。如果您尚未决定,请选择最简单的(static
方法)并查看其进展情况:)
答案 1 :(得分:2)
我从here采用的经验法则是
尽可能使用合成,必要时使用私有继承。
“你必须”的一个具体例子是,你继承的类具有一些虚拟或纯虚函数,你必须实现这些函数才能使用你的私有库:如果没有继承,你根本就做不到。
从您的描述中看,使用继承是不可避免的;因此,我认为最好使用合成。