2014-11-22 90 views
0

我想這mov()虛成員函數get()的座標x,y
但是有這個錯誤,完全不
pirate.o意義: :函數'ZN6Pirate3movEPS_PA100_3Sea':|
pirate.cpp ::未定義參考`船舶::的getX()const的」(第7行)

的getX()被繼承
父類:船舶,派生類:海盜未定義的引用成員函數(假意外錯誤)

Ship.h

#ifndef SHIP_H 
#define SHIP_H 
#include <iostream> 
#include "sea.h" 
#define SIZE 100 
class Ship 
{ 
private: 
    int x,y; //Coordinates of ship 
public: 
    Ship(){} 
    virtual void func()=0; 
    virtual void mov()=0; 
protected: 
    int getX()const; 
    int getY()const; 
}; 

#endif 

Ship.cpp

#include "Ship.h" 
int Ship::getX()const 
{return x;}  
int Ship::getY()const 
{return y;} 
virtual void func()=0; 
virtual void mov()=0; 

Pirate.h

#ifndef PIRATE_H 
#define PIRATE_H 
#include "ship.h" 
#include "sea.h" 
class Pirate : public Ship 
{ 
protected: 
     void func(); 
     void mov(Pirate * ship , Sea Map[SIZE][SIZE]); 
}; 
#endif 

Pirate.cpp

#include "pirate.h" 

void Pirate::func(){} 

void Pirate::mov(Pirate* ship , Sea Map[SIZE][SIZE]) 
{ 
int x_ref = ship->getX(); 
int y_ref = ship->getY(); 
} 

Sea.h

#ifndef SEA_H 
#define SEA_H 
#include "ship.h" 
class Sea 
{ 
private: 
    bool hasShip; 

public: 
    Sea(){hasShip=0;} 
    bool gethasShip()const{return hasShip;} 
    void sethasShip(bool i){hasShip = i;} 
}; 
#endif 
+1

如果你有一個鏈接錯誤,就是不你正在編譯的代碼。那個階段之前有很多錯誤。 – molbdnilo 2014-11-22 20:09:41

+0

@molbdnilo存在純虛擬,傳遞類的相同對象,可能是繼承getX()的範圍問題爲什麼它應該是鏈接器錯誤? – hitter 2014-11-22 20:12:36

+1

ship.h中的C++的第一行是'private:',所以你在代碼中缺少了一些東西。 'ship.h'試圖包含'sea.h'(爲什麼?),它試圖包含'ship.h'(再次,爲什麼?) - 這是行不通的。如果您想要回答失敗的原因,您還需要顯示編譯命令。 – 2014-11-22 20:16:14

回答

3

另一個答案是完全正確的。如果你刪除了這兩行,它會正確編譯,並且你得到的錯誤(以及你沒有得到其他錯誤的事實)是由於Ship.cpp沒有被正確包含在編譯過程中。

我不知道如果你有機會到Visual Studio 2013,但如果這樣做,我測試了它,以確保與下面的解決方案/項目:http://filebin.ca/1i9z9TwF2kf5/Pirates.zip

+0

@Amadeus我使用Visual Studio 2013和Dev-C++編譯了我的整個項目(不只是pirate.cpp)並且使用Dev-C++ 並且它不使用編譯器/ linker erros 非常感謝! – hitter 2014-11-23 17:21:36

2

你忘了編譯和鏈接Ship.cpp

我可以,因爲如果講這個你試圖編譯它,那麼你會在這裏得到一個錯誤:

virtual void func()=0; 
virtual void mov()=0; 

這不是有效的C++,你沒有定義純虛像(你並不需要在所有的,除非他們是析構函數或顯式調用他們定義它們)

如果你不」 t鏈接到定義爲Ship::getX() const的文件,那麼鏈接器告訴你它沒有定義就不足爲奇了。

+0

實際上Codeblocks對我編譯,鏈接 在代碼方面什麼是正確的定義? 感謝您回答 – hitter 2014-11-22 20:23:04

+0

虛擬void func()= 0;'本身是有效的 示例 http://stackoverflow.com/questions/1306778/c-virtual-pure-virtual-explained?lq=1 – hitter 2014-11-22 20:29:47

+1

Erm,不,該行本身只在**一個類體內有效,不在文件範圍內,因爲它在'Ship.cpp'中。我不知道你認爲那個鏈接是一個例子。您需要告訴您IDE如何向項目添加額外的文件。 – 2014-11-22 20:34:56

相關問題