前向声明覆盖完整定义

时间:2017-04-29 20:03:12

标签: c++ include forward-declaration

我知道有一些关于前瞻性声明的主题,但在阅读之后,他们似乎并不符合这种情况。我通常了解发生了什么,需要一个完整的定义来分配。但是,我真的认为我在这里有一个完整的定义,所以我很困惑。

//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

3 个答案:

答案 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