2016-08-04 80 views
0

我知道虛擬類,他們不能被實例化,現在我有一個關於一個關於它的情況下的問題,假設我們有一個純粹的抽象類象下面這樣:如何在其他類(或任何類)中使用抽象類?

class Color{ 
public: 
    Color(); 
    virtual string getName()=0; 
    ~Color(); 
}; 

和2類繼承的形式,它:

class Blue:public Color 
{ 
public: 
    Blue(); 
    ~Blue(); 
    string getName(); 
}; 

class Red:public Color{ 
public: 
    Red(); 
    ~Red(); 
    string getName(); 
}; 

和第三類要使用Color類作爲其構造函數的參數和數據成員:

class Foo{ 
public: 
    Foo(); 
    Foo(Color&); 
    ~Foo(); 
    void draw(Color&); 
private: 
    Color* co; 
}; 

及其實施:

Foo::Foo():co(new Color()){ 
} 

Foo::Foo(Color &c):co(new Color(c)){ 
} 

現在,我知道這部分new Color()new Color(c)是錯誤在這種情況下,但我只想用一個類型Color傳遞給Foo而不是直接使用BlueRed作爲參數。

什麼是解決方案?我必須使用重載或其他東西嗎?和方法draw我有什麼問題嗎? 和我讀了約設計模式,這是否幫助我對這種情況?

tnx您的回覆。

+0

在默認構造函數中將'co'初始化爲空指針? –

+0

@Joachim Pileborg不,我沒有使用。 – mehdi

回答

1

對於帶顏色&構造函數,你可以存儲引用或指針的顏色傳遞的,如果你能肯定它會繼續如果你想存儲一個指向先前存在的顏色的指針,並確保它不會被過早刪除,那麼智能指針可能適合你的使用。或者,如果您希望自己的課程擁有自己的顏色副本,則可以使用克隆模式。 顏色的複製構造函數將不得不返回一個顏色(不是從它派生的類),這是不可能的,因爲顏色是抽象的。克隆將是一個返回顏色指針的顏色的虛函數。在派生類中,它被實現爲返回派生類型的新實例。

class Color 
{ 
    public: 
    virtual Color* Clone() const = 0; 
}; 

class Red : public Color 
{ 
    public: 
    virtual Red* Clone() const 
    { 
     return new Red(*this); // updated to use copy constructor 
    } 
}; 

Foo::Foo(const Color& c) : co(c.Clone()) 
{} 

對於您需要選擇是否其Foo的顏色OK *成員爲空,如果是則在nullptr傳遞作爲建議的默認構造函數FOO。 如果不是,您可以選擇默認顏色來初始化顏色*。注意Foo仍然保持顏色*不是紅色*。你可以用一個typedef或使用語句中指定的默認顏色類,以確保您定義默認只有一次: -

using DefaultColour = Red; 
Foo::Foo() : co(new DefaultColour()) {} 

或者只是不給富默認的構造 - 堅持一個顏色提供

+0

tnx非常適合您的出色表現,我是C++的新手,並且您講過關於智能指針的問題,能否告訴我如何使用它,如果您喜歡,並且您使用typedef或使用語句說到默認顏色類,我該怎麼做?是DefaultColour類? – mehdi

+1

關於默認顏色 - 這是上例中的using語句。 (typdef會是一種老式的方式來做同樣的事情)。它是你班級的別名,在這種情況下,我說默認是紅色,然後我可以在任何需要它的地方引用DefaultColour,但如果我決定將默認設置更改爲藍色,則只有一行需要更改(與使用行)。它還有助於使代碼自行記錄,因爲當使用DefaultColor時,它顯示您使用它,因爲它的默認值是紅色或藍色,而不是特別的。 – ROX

+1

關於智能指針 - 最好查看它們,我無法全面覆蓋它,以及您需要如何使用它,這取決於您傳遞給Foo構造函數的顏色對象發生了什麼。我之所以提到它的原因是,如果你存儲一個指向傳入構造函數的對象的指針,你不希望該對象被刪除到其他地方,並讓你的foo類仍然指向內存不再存在的對象以前是。 – ROX

1

初始化你的會員指針nullptr

Foo::Foo() : co(nullptr) {} 
Foo::Foo(Color &c) : co(nullptr) {} 
+1

看起來像是一個默認構造函數的可能解決方案,但奇怪的是有一個帶有顏色並且忽略它的構造函數的版本。 – ROX