2015-05-16 79 views
3

錯誤在這裏:C++訪問抽象類的指針向量的子類的成員

Rocket.cpp:31:16: error: no member named 'getThrust' in 'RocketPart' 
    rocket[0]->getThrust(); 

當我想從Engine類在vector<RocketPart*> rocket訪問getThrust()rocket[i]->getThrust(),我從我的問題上得到錯誤信息。 我在做什麼錯?是否有可能通過火箭[索引] - > getThrust()訪問它?

回答

1

您收到的錯誤是正確的:RocketPart中沒有稱爲getThrust的函數。您可以:

  • virtual float getThrust()添加到您的RocketPart類中。這可能不是一個好的解決方案,因爲不是所有的RocketPart都可能包含推力;但是,你可以從它只是return 0,或使它成爲一個純虛函數(這將意味着你不再是有史以來創建RocketPart對象
  • dynamic_castRocketPart對象爲Engine。這可以通過應做到以下幾點:

    for (size_t r = 0; r < rocket.size(); ++r) { if (const Engine* engine = dynamic_cast<Engine*>(rocket[r])) { // able to successfully convert this RocketPart into an Engine engine.getThrust(); } }

您將無法施放任何RocketPart*這不是一個Engine

+0

我可以使用rocket.addPart()方法輕鬆添加Engine *引擎嗎?還是我必須將它轉換回RocketPart *? – user3653164

+0

是的,你可以!因爲'Engine'是'RocketPart'的派生類,所以接受'RocketPart'的任何函數都可以傳入'Engine'。這意味着你也可以將'Engine'push_back爲'std :: vector ' – Tas

+0

謝謝你和其他人幫助我! – user3653164

0

您需要添加

virtual float getThrust() = 0; 

在你RocketPart類。 此外,我可以看到絕對沒有理由使用虛擬繼承(如果您從多個類繼承和The Diamond Problem時,才需要),所以不是:

class Engine : virtual public RocketPart { 

你應該確定只:

class Engine : public RocketPart { 

我也建議看你的內存分配(S) - 如果您的示例源代碼是不是隻是一個例子(你正在泄漏Engine對象,也許vector<shared_ptr<Engine>>將是一個是想法?)

2

RocketPart沒有函數getThrust()裏面,這就是爲什麼你的向量調用函數不起作用。如果getThrust()是會從它繼承的類使用的公共程序,你應該在基類中添加它作爲一個虛函數,像這樣:

class RocketPart { 
public: 
    RocketPart(); 
    RocketPart(const RocketPart& orig); 
    virtual ~RocketPart(); 

    virtual float getThrust(); 

    virtual void print() = 0; 
protected: 
    // some members 
}; 
0

這是因爲存儲在容器中的類型是RocketPart 。 您需要將指針向下轉換爲引擎。 所以不是

rocket[0]->getThrust(); 

你需要寫:

Engine *pPart = (Engine *) rocket[i]; //you can use also static_cast<> or dynamic_cast<> 
pPart->getThrust(); 

使用施放時要小心:如果火箭[i]是不是一個引擎,該程序可能會崩潰。

0

的方法getThrust()在引擎類中定義不在RocketPart中。 您需要移動基類RocketPart中的方法,以通過向量訪問它。 或者,您也可以使用動態轉換將RocketPart「轉換」到引擎。

Engine* engine = dynamic_cast<Engine>(rocket[index]); 
if (engine) { 
    engine->getThrust(); 
} 

考慮到使用dynamic_cast通常意味着設計不好。