2016-07-10 6 views
-3
class Attraction { 

}; 

class Museum : public Attraction { 
private: 
    double price; 

public: 
    void setPrice(double Price) { 
     price = Price; 
    } 

    double getPrice() { 
     return price; 
    } 
}; 

class Park : public Attraction { 

public: 
    double getPrice() { 
     return 0; 
    } 

}; 

class Theatre : public Attraction { 
private: 
    double price; 

public: 
    void setPrice(double Price) { 
     price = Price; 
    } 

    double getPrice() { 
     return price; 
    } 

}; 

int _tmain(int argc, _TCHAR* argv[]) { 

    vector<Attraction> attraction; 

    vector<Attraction>::iterator i; 

    for (i = attraction.begin(); i != attraction.end(); i++) { 

     if (i->getPrice() < 5) { 
      cout << endl; 
     } 
    } 
} 
+0

することができます」あなたがそれを設計したやり方で。 'Attraction'には' getPrice'メソッドがありません – smac89

+2

@khredos:それは主な問題ではありません(理論的には静的な訪問者を持つことができます)。 – lorro

+0

短い答えは - そうではありません。しかし、「正しい方法」は、ユースケースの詳細に依存します。 'unique_ptr'のベクトルが必要な場合は、' ptr_vector'が必要です。まったく別のものが欲しいかもしれません。たとえば、コレクションに対処する場合、どのようなセマンティクスが必要ですか? –

答えて

2

vector<Attraction>はオブジェクトのスライスを実行するため、派生クラスのgetPrice()にアクセスすることはできません。代わりにAttractionクラスに仮想double GetPrice()メソッドがある多態性を使用し、vector<Attraction*>new/deleteをオブジェクトに使用する必要があります。 Attractionでデストラクタを作成することを忘れないでください。deleteベースポインタを使用して子孫オブジェクトを作成することができます。

2

表示しているコードでは、実行しようとしていることはできません。あなたは多型を正しく利用していません。

は代わりにもっとこのような何かを試してみてください:

class Attraction 
{ 
public: 
    Attraction() {} 
    virtual ~Attraction() {} 

    virtual double getPrice(double Price) 
    { 
     return 0.0; 
    } 
}; 

class PriceyAttraction : public Attraction 
{ 
private: 
    double price; 

public 
    PriceyAttraction(double Price = 0.0) : Attraction(), price(Price) {} 

    virtual double getPrice() 
    { 
     return price; 
    } 

    void setPrice(double Price) 
    { 
     price = Price; 
    } 
}; 

class Museum : public PriceyAttraction 
{ 
public: 
    Museum(double Price = 0.0) : PriceyAttraction(Price) {} 
}; 

class Park : public Attraction 
{ 
public: 
    Park() : Attraction() {} 
}; 

class Theatre : public PriceyAttraction 
{ 
public: 
    Theatre(double Price = 0.0) : PriceyAttraction(Price) {} 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::vector<Attraction*> attraction; 

    attraction.push_back(new Museum(5.00)); 
    attraction.push_back(new Park); 
    attraction.push_back(new Theatre(7.50)); 

    std::vector<Attraction*>::iterator i; 
    for (i = attraction.begin(); i != attraction.end(); ++i) 
    { 
     std::cout << i->getPrice() << std::endl; 
     //... 
    } 

    for (i = attraction.begin(); i != attraction.end(); ++i) 
    { 
     delete *i; 
    } 
} 

を使用すると、C++ 11以降を使用している場合、あなたはあなたのためのオブジェクトの割り当て解除を管理するためにstd::unique_ptrを使用することができます。

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::vector<std::unique_ptr<Attraction>> attraction; 

    attraction.emplace_back(new Museum(5.00)); 
    attraction.emplace_back(new Park); 
    attraction.emplace_back(new Theatre(7.50)); 
    /* or: 
    attraction.push_back(std::unique_ptr<Attraction>(new Museum(5.00))); 
    attraction.push_back(std::unique_ptr<Attraction>(new Park)); 
    attraction.push_back(std::unique_ptr<Attraction>(new Theatre(7.50))); 
    */ 
    /* or: 
    attraction.push_back(std::make_unique<Museum>(5.00)); 
    attraction.push_back(std::make_unique<Park>()); 
    attraction.push_back(std::make_unique<Theatre>(7.50)); 
    */ 

    vector<Attraction>::iterator i; 
    for (i = attraction.begin(); i != attraction.end(); ++i) 
    { 
     std::cout << (*i)->getPrice() << std::endl; 
     //... 
    } 
} 
関連する問題