我必須在C++中實現工廠方法模式。由工廠「組裝」的類(C)是抽象的,並由其他類(D)繼承。所以我不想C有一個構造函數。但是爲了創建一個D的實例,C必須至少有一個受保護的構造函數。但是,有人可能從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.
}
};
您的代碼原樣會失敗,因爲D無法從C繼承。您已將構造函數設爲私有。沒有任何東西可以繼承自C。 – 2011-06-09 15:40:49
我不認爲你的方法有效:'class EvilC:public C {EvilC():C((C *)0){}};' – 2011-06-09 15:41:35
它有多重要,以防止其他人派生從C?你是否試圖防止意外或故意濫用? (試圖防止後者通常浪費我的經驗。) – 2011-06-09 15:42:55