2011-06-09 90 views
0

我必須在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. 
} 
}; 
+0

您的代碼原樣會失敗,因爲D無法從C繼承。您已將構造函數設爲私有。沒有任何東西可以繼承自C。 – 2011-06-09 15:40:49

+0

我不認爲你的方法有效:'class EvilC:public C {EvilC():C((C *)0){}};' – 2011-06-09 15:41:35

+0

它有多重要,以防止其他人派生從C?你是否試圖防止意外或故意濫用? (試圖防止後者通常浪費我的經驗。) – 2011-06-09 15:42:55

回答

2

這可能是一個更好的選擇得到C,私有構造,使d朋友C類

+0

謝謝,我真的沒有想到這一點,儘管它是方式smipler。 – 2011-06-09 15:39:27

+0

儘管創建從C到D的依賴關係,但它應該是相反的。 – 2011-06-09 15:43:41

+0

是的,但如果你想確保只有D可以實例化C,我不認爲有任何方法可以避免在這個方向上的依賴。 – Sven 2011-06-09 15:48:45

0

的有沒有你是一個C對象的工廠複製原因是什麼?

如果不是:

C* ptr = new C(); 
ptr = new D(ptr); 

你做d朋友C,做了一個默認的構造函數爲d,而在工廠只有:

ptr = new D(); 

這將簡化事情。