我必须在C ++中实现工厂方法模式。由工厂“组装”的类(C)是抽象的并且由其他类(D)继承。所以我不希望C有一个构造函数。但是要创建D的实例,C必须至少具有受保护的构造函数。但是有人可能从C派生并以这种方式创建C的实例。我不希望这种情况发生。所以我创建了一个受保护的构造函数,它接受一个指向C对象的指针以供派生类使用,代码如下。问题是这是否是处理这个问题的正确方法。
class C {
private:
C() {}
protected:
C(const C* c) {}
friend class CFactory
};
class D: public C
{
private:
D(const C* c): C(c) {}
friend class CFactory;
};
class CFactory
{
public:
static C* createC() {
C* ptr = new C();
ptr = new D(ptr); // There is garbage collection on the project, so no memory leak.
}
};
答案 0 :(得分:2)
给C一个私有构造函数并使D成为C的朋友类可能是更好的选择。
答案 1 :(得分:0)
您是否有理由在工厂中复制C对象?
如果不是:
C* ptr = new C();
ptr = new D(ptr);
你让D成为C的朋友,为D做了一个默认的构造函数,而且在工厂里只有:
ptr = new D();
这会简化事情。