我知道有一些关于前瞻性声明的主题,但在阅读之后,他们似乎并不符合这种情况。我通常了解发生了什么,需要一个完整的定义来分配。但是,我真的认为我在这里有一个完整的定义,所以我很困惑。
//game.h
#include "wizard.h"
#include "warrior.h"
#include "archer.h"
#include "fighter.h"
#ifndef GAME_H
#define GAME_H
enum movetype{
BOOST,
ATTACK,
SPECIAL,
SHIELD
};
struct move{
enum movetype type;
fighter * source;
fighter * target;
};
class game{
public:
game();
~game();
void execmove(move&);
bool trymove();
private:
bool turn;
fighter* t1 [3];
fighter* t2 [3];
};
#endif
所以在游戏中我包括了所有其他类 在战斗机中我向前宣战战士:
//fighter.h
#ifndef FIGHTER_H
#define FIGHTER_H
class fighter;
class warrior;
struct link {
fighter * warrior;
fighter * target;
};
class fighter{
private:
public:
fighter();
virtual ~fighter();
void action(int, fighter*);
virtual void special(fighter*);
void attack(fighter*);
void defend();
void tick();
void damage(int,int);
void createLink(warrior *);
void removeLink();
protected:
int hp;
int priority;
int boosts;
int shields;
bool alive;
struct link l;
};
#endif
但是当我尝试在游戏中分配战士时:
//game.cpp
#include <iostream>
#include "game.h"
game::game()
{
t1[0] = new warrior();
t1[1] = new wizard();
t1[2] = new archer();
t2[0] = new warrior();
t2[2] = new archer();
t2[1] = new wizard();
}
game::~game()
{
for(int i = 0; i<3; i++)
{
delete t1[i];
delete t2[i];
}
}
void game::execmove(move& m)
{
}
我明白了:
game.cpp:9:14: error: allocation of incomplete type 'warrior'
t1[0] = new warrior();
^~~~~~~
./fighter.h:7:7: note: forward declaration of 'warrior'
class warrior;
^
game.cpp:13:14: error: allocation of incomplete type 'warrior'
t2[0] = new warrior();
^~~~~~~
./fighter.h:7:7: note: forward declaration of 'warrior'
class warrior;
似乎我转发声明的事实使得编译器忽略了这样一个事实,即我还包括完全定义,这是非常奇怪的。我想知道是否有一些我遗失的东西,因为如果前向声明使得完整定义被忽略,我就不知道如何修复它。
结论:为什么我不能分配warrior,因为我在game.h中包含了完整的warrior.h文件?
这是warrior.h:
#include "fighter.h"
#ifndef FIGHTER_H
#define FIGHTER_H
class warrior{
public:
warrior();
~warrior();
void special(fighter);
private:
};
#endif
答案 0 :(得分:2)
将warrior.h更改为:(即正确包括警卫)
#ifndef WARRIOR_H
#define WARRIOR_H
#include "fighter.h"
class warrior{
public:
warrior();
~warrior();
void special(fighter);
private:
};
#endif
或者如果支持
,最好还是使用#pragma once
答案 1 :(得分:1)
您需要使用不同.h文件的不同包含保护符号。
&#34; fighter.h&#34;定义FIGHTER_H
,所以当在&#34; warrior.h&#34;中遇到#if检查时<{1}}的定义被跳过。
答案 2 :(得分:0)
错误命名的警卫使其不包括战士文件。谢谢@ 1201ProgramAlarm