未定义的成员函数引用(错误的意外错误)

时间:2014-11-22 20:04:45

标签: c++ compiler-errors pure-virtual

我希望这个mov()虚拟成员函数到get()坐标x,y
然而,这个错误根本没有意义
pirate.o :: 在功能' ZN6Pirate3movEPS_PA100_3Sea':|
pirate.cpp :: 未定义对`Ship :: 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

2 个答案:

答案 0 :(得分:3)

另一个答案是完全正确的。如果删除这两行,它将正确编译,并且您获得的错误(以及您没有得到其他错误的事实)是由于Ship.cpp未正确包含在编译过程中。< / p>

我不确定您是否可以访问Visual Studio 2013,但如果您这样做,我会对其进行测试以确保使用以下解决方案/项目:http://filebin.ca/1i9z9TwF2kf5/Pirates.zip

答案 1 :(得分:2)

您忘记编译并链接Ship.cpp

我可以告诉你,因为如果你试图编译它,那么你会在这里遇到错误:

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

这不是有效的C ++,你没有定义那样的纯虚拟(你根本不需要定义它们,除非它们是析构函数或你明确地调用它们)

如果您没有使用Ship::getX() const的定义链接文件,那么链接器告诉您它未定义就不足为奇了。