2016-07-10 4 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() производных классов. Вместо этого вам нужно использовать полиморфизм, где у вас есть виртуальный метод double GetPrice() в классе Attraction, а затем используйте 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 управлять объектом deallocations для вас:

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; 
     //... 
    } 
} 
Смежные вопросы