sud*_*ian 0 c++ virtual gcc undefined
我收到此编译器错误.我有几百行代码,所以我会发布一些我认为可能相关的代码,但你需要告诉我你想看到的内容.
这是我在编译时得到的错误:
/tmp/ccBE5kZ5.o:game.cpp:(.text+0x1067): undefined reference to `vtable for Person'
/tmp/ccBE5kZ5.o:game.cpp:(.text+0x17a5): undefined reference to `vtable for Person'
/tmp/ccBE5kZ5.o:game.cpp:(.text+0x1ee6): undefined reference to `vtable for Person'
/tmp/ccBE5kZ5.o:game.cpp:(.text+0x2560): undefined reference to `vtable for Person'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: /tmp/ccBE5kZ5.o: bad reloc address 0xc in section `.text$_ZN6WeaponD1Ev[Weapon::~Weapon()]'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: final link failed: Invalid operation
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
这是我的Person班级和我的Weapon班级的宣言,而Actor班级Person是以下的后代:
class Actor {
public:
virtual void act();
virtual string getName();
virtual void setName(string n);
Actor();
Actor(string n);
virtual ~Actor();
private:
string name;
};
class Person : public Actor {
public:
void act();
virtual void fight(Person enemy);
virtual void takeDamage(double dmg);
// getters and setters
virtual unsigned getX();
virtual void setX(unsigned amt);
virtual unsigned getY();
virtual void setY(unsigned amt);
virtual Weapon getWeapon();
virtual void setWeapon(Weapon w);
virtual Weapon getArmor();
virtual void setArmor(Weapon a);
virtual unsigned getLevel();
virtual void setLevel(unsigned amt);
virtual double getHealth();
virtual void setHealth(double amt);
virtual double getXP();
virtual void setXP(double amt);
Person();
Person(string n);
private:
Weapon wep;
Weapon armor;
double xp;
unsigned level;
double health;
unsigned x;
unsigned y;
};
class Weapon {
public:
double getStrength();
void setStrength(double s);
double getValue();
void setValue(double amt);
double getHealth();
void setHealth(double amt);
string getName();
void setName(string n);
string getType();
void setType(string t);
Weapon();
Weapon(string n, string t, double dmg);
private:
string name;
string type;
double value;
double health;
double strength;
};
Run Code Online (Sandbox Code Playgroud)
您的错误归结为单一定义规则(ODR)以及语言对程序的要求.特别要求必须定义所使用的每个功能.非虚函数如果被调用则被认为是odr-used,或者它的地址被采用.所有虚函数都是使用过的,因此必须在程序中定义.
回到程序中的确切错误,可能是由于GCC编译器如何处理虚拟表的生成,这基本上归结为一个简单的规则:虚拟表在包含定义的转换单元中定义类中的第一个非内联虚函数.如果所有虚函数都是内联的,那么将在包含类定义的每个和所有翻译单元中生成vtable.
在您的情况下,似乎至少有一个虚拟函数未在内联声明或在程序中链接的一个翻译单元中定义.如果在其中一个转换单元中定义了第一个非内联虚函数,则会生成vtable,并且您将获得有关缺少任何定义的虚拟函数的定义的不同错误消息.
| 归档时间: |
|
| 查看次数: |
1754 次 |
| 最近记录: |