2012-02-18 41 views
0

可以說我有電視機類和BigTelevision類C++基本類

class television 
{ 
    protected: 
     int a; 
    ... 
} 
class BigTelevision:public television 
{ 
    private: 
    int b; 
... 
} 

我想包含混合電視和BigTelevision的集合,做什麼選擇我有。 我知道一種方法是使用數組,但問題是,如果我聲明一個電視類型的數組來存儲它們,BigTelevision的附加屬性(例如int b)將會丟失。

我該如何解決這個問題?

+0

爲什麼大電視需要由不同的班級代表?你需要爲大型電視模擬什麼不同的行爲? – 2012-02-18 11:22:19

+0

BigTelevision作爲一個屬性可能有折扣,不管電視是否具有折扣。如果我使用它來存儲Bigtelevision類型,Television temp [20]將導致BigTelevision的某些屬性丟失。有什麼方法可以將兩種不同類型的東西作爲一個集合存儲在一起 – user1203499 2012-02-18 11:27:42

+0

你可以在'television'類中擁有'b'成員,嘗試存儲這樣的內存毫無意義。除非你有幾千個「電視」。 – 2012-02-18 11:30:55

回答

4

您必須存儲基類指針或基類智能指針,並使用像boost:ptr_vector這樣的指針集合。

std::vector<television*> tv; 
tv.push_back(new television); 
tv.push_back(new BigTelevision); 
// don't forget to delete 


// better: 
std::vector<std::unique_ptr<television>> tv; 
tv.push_back(std::unique_ptr<television>(new television)); 
tv.push_back(std::unique_ptr<television>(new BigTelevision)); 

您現在可以通過通用接口(多態性)使用不同的對象。

class television 
{ 
public: 
    // The interface for all television objects. 
    // Each television can calculate its price. 
    virtual int Price() const { return price_; } 
private: 
    int price_; 
}; 

class BigTelevision 
{ 
public: 
    virtual int Price() const { return television::Price() * discount_; } 
private: 
    double discount_; 
}; 

int main() 
{ 
    std::vector<std::unique_ptr<television>> shoppingCard; 
    // add a basic television and a BigTelevision to my shopping card 
    shoppingCard.push_back(std::unique_ptr<television>(new television)); 
    shoppingCard.push_back(std::unique_ptr<television>(new BigTelevision)); 

    // whats the price for alle the tvs? 
    int price = 0; 
    for(auto tv = begin(shoppingCard), last = end(shoppingCard); 
     tv != last; ++tv) 
     price += (*tv)->Price(); 

    // or: 
    int price = std::accumulate(begin(shoppingCard), end(shoppingCard), 0, 
       [](int sum, const std::unique_ptr<television>& tv) 
       { return sum + tv->Price()}); 

} 
+0

我認爲make_unique(..)不需要指向堆分配對象的指針 - 它創建一個並將其分配給std :: unique_ptr <..>。 //編輯:假設std :: make_unique <..>(..) – Simon 2012-02-18 12:05:38

+0

@Simon不幸的是,沒有'std :: make_unique <>()'這樣的東西' – inf 2012-02-18 13:14:48

+0

你是對的。我刪除了make_unique調用..它不是標準的。 – hansmaad 2012-02-18 13:15:27

0

你會使用這兩個類通用的方法嗎?如果是這樣,請使該方法虛擬並創建一個指向基類的指針數組。