0

このコンパイラ エラーが発生します。数百行のコードがあるので、関連すると思われるものをいくつか投稿しますが、何を見たいか教えてください。

コンパイル時に発生するエラーは次のとおりです。

/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

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;
};
4

2 に答える 2

8

エラーは、One Definition Rule (ODR) と、言語がプログラムに課す要件に要約されます。特に、使用されるすべての関数を定義する必要があるという要件。非仮想関数は、呼び出された場合、またはそのアドレスが取得された場合、odr 使用と見なされます。すべての仮想関数はODR で使用されるため、プログラムで定義する必要があります。

プログラムの正確なエラーに戻ると、GCC コンパイラが仮想テーブルの生成を処理する方法が原因である可能性があります。これは、基本的に単純なルールに要約されます。仮想テーブルは、定義を保持する変換単位で定義されます。クラス内の最初の非インライン仮想関数の。すべての仮想関数がinlineの場合、クラスの定義を含むすべての変換単位で vtable が生成されます。

あなたの場合、インラインで宣言されていない、またはプログラムでリンクされる翻訳単位の1つで定義されていない仮想関数が少なくとも1つあるようです。最初の非インライン仮想関数が変換単位の 1 つで定義されている場合、vtable が生成され、定義のない仮想関数の定義の欠如に関する別のエラー メッセージが表示されます。 .

于 2012-05-19T02:33:13.057 に答える
1

定義されていないvirtualフィールドがあると言っています。Personこれまでのところ、宣言は確認できますが、定義は確認できません。継承されたものを含め、 のすべての仮想フィールドPersonが定義されていることを確認します。

于 2012-05-19T02:32:04.477 に答える