2017-05-11 66 views
1

所以我試圖在一個戰艦程序的開始實現多態性,但我不斷收到一個intellisense錯誤,告訴我我的一個標識符是未定義的,當我嘗試調用基類構造函數時。C++多態構造函數錯誤;標識符是undefined

這裏是基類的代碼,Ship.h:

#ifndef SHIP_H 
#define SHIP_H 
#include <iostream> 

class Ship 
{ 
public: 
Ship(int, int); 
void setX(int); 
int getX() const; 
void setY(int); 
int getY() const; 
private: 
    int x; 
    int y; 
}; 


#endif 

,這裏是它的構造

#include "Ship.h" 

using namespace std; 

Ship::Ship(int userX, int userY) 
{ 
    setX(userX); 
    setY(userY); 
} 

派生類的頭:

#ifndef FRIGATE_H 
#define FRIGATE_H 

#include "Ship.h" 

class Frigate : public Ship { 
public: 
    Frigate(int); 
    void placeShip(); 
    void setLength(int); 
    int getLength() const; 
private: 
    int length; 
}; 

#endif 

,它的構造

#include <iostream> 
#include "Frigate.h" 

using namespace std; 

Frigate::Frigate(int specLength) : Ship(userX, userY) 
{ 
    setLength(specLength); 
} 

當我嘗試打電話給這裏的船舶構造函數時,我不斷收到一個錯誤,該錯誤提示標識符userXuserY未定義,但我在基類的構造函數中定義了它們。我做錯了什麼?

+0

在'Frigate'初始化程序中,您將未定義的變量'userX'和'userY'傳遞給基類構造函數,並且編譯器正確地告訴您它不知道這些變量。 –

回答

2

您的基類構造函數需要2個參數。您的派生類構造函數只接受一個參數。當派生類的構造函數被調用,它會調用基類的構造函數,但你需要給他,這需要2個值...

我覺得你的Frigate類的構造函數應該像

Frigate::Frigate(int userX, int userY, int specLength) : Ship(userX, userY), length(specLength) 
{ 
} 
+0

除非他想隨機化它,在這種情況下,你必須在隨機調用後從'Frigate'構造函數體內部調用基構造函數。我不知道,只是猜測他可能想要什麼。 – Donnie

+1

@Donnie在這種情況下,他需要爲Ship定義一個默認(空)構造函數,因爲調用鏈需要在執行構造函數的主體之前完成。正如你所說,我們不完全確定他想要什麼。 – AlexG

+0

謝謝,我知道這是我忘了做的事情。 – stor314