2014-11-22 28 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

相关问题