2012-02-18 4 views
0

基本的には私はテレビやBigTelevisionの混合のコレクションが含まれているしたいテレビのクラスとBigTelevisionクラスC++クラス

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

を考えてみましょう、何のオプション私は持っています。 私は1つの方法は、配列を使用することですが、これの問題は、私はそれらを格納するためにテレビの型の配列を宣言すれば、BigTelevisionの追加の属性(例えばint b)が失われるということです。

どうすればこの問題を回避できますか?

+0

なぜ大きなテレビは別のクラスで表現する必要がありますか?大きなテレビのためにモデル化するためには、どのような異なる行動が必要ですか? –

+0

BigTelevisionはテレビのように属性として割引を持つことがあります。私がBigtelevisionタイプを保存するために使用すると、テレビtemp [20]はBigTelevisionのいくつかの属性を失うことになります。コレクションとして2つの異なる型を一緒に格納する方法はありますか? – user1203499

+0

'television'クラスに' b'メンバを置くことができます。そのようなメモリを節約しようとしても意味がありません。あなたが何千ものテレビを持っていない限り。 –

答えて

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

+0

@Simon残念ながら、 'std :: make_unique <>()'のようなものはまだありません – inf

+0

あなたはそうです。私はmake_unique呼び出しを削除しました。(まだ)標準ではありません。 – hansmaad

0

両方のクラスに共通の方法を使用しますか?その場合は、そのメソッドを仮想化し、基本クラスへのポインタの配列を作成します。