2012-02-18 2 views
0

내가 텔레비전 클래스와 BigTelevision 클래스C++ 기본 클래스

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

내가 어떤 옵션을 내가해야합니까, 텔레비전 및 BigTelevision의 혼합의 컬렉션을 포함 할이 있다고 할 수 있습니다. 한 가지 방법은 배열을 사용하는 것입니다하지만이 문제는 내가 TVT 배열을 선언하면 BigTelevision의 추가 특성 (예 : int b)이 손실된다는 것입니다.

어떻게 해결할 수 있습니까?

+0

왜 대형 텔레비전을 다른 클래스에서 나타내야합니까? 대형 TV에서 어떤 모델링을해야합니까? –

+0

BigTelevision은 텔레비전에없는 것처럼 속성으로 할인을받을 수 있습니다. TV temp [20]는 Bigtelevision 유형을 저장하는 데 BigTelevision을 사용하면 일부 속성이 손실됩니다. 거기에 컬렉션으로 두 가지 유형을 함께 저장할 수있는 방법이 무엇입니까 – user1203499

+0

'b' 멤버를'television' 클래스에 가질 수 있습니다. 그런 식으로 메모리를 절약하려고 할 필요는 없습니다. 않는 한 너는'텔레비전'의 수천을 가지고 가기 위하여려고하고 있지 않으면. –

답변

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

@ 시몬 불행히도'std :: make_unique <>()'와 같은 것이 없습니다. 아직 – inf

+0

맞습니다. make_unique 호출을 제거했습니다. 아직 (아직) 표준이 아닙니다. – hansmaad

0

두 클래스에 공통된 방법을 사용 하시겠습니까? 그렇다면 가상 클래스를 만들고 기본 클래스에 대한 포인터의 배열을 만듭니다.

관련 문제