2

标题可能不是很清楚,比这要复杂一些。我在网上搜索了类似我的问题的问题,但没有找到任何可以帮助我的东西。
这与无限循环包含无关,我已经放置了预处理器指令来避免这种情况。

我有两个类 Monster 和 Character,分别在自己的头文件monster.hppcharacter.hpp中声明,并分别在自己的源文件monster.cppcharacter.cpp中实现。
现在的问题是两个类都需要彼此工作。

怪物.hpp

#ifndef INCLUDE_MONSTER_HPP
#define INCLUDE_MONSTER_HPP

#include "character.hpp"

class Monster
{
  private: //Atributes

  public:  //Methods
    void attackM(Monster& id);
    void attackC(Character& id);
};

#endif //MONSTER_HPP_INCLUDED

字符.hpp

#ifndef INCLUDE_CHARACTER_HPP
#define INCLUDE_CHARACTER_HPP

#include "monster.hpp"

class Character
{
    private:  //Attributes

    public:   //Methods
        void attackM(Monster& id);
        void attackC(Character& id);
};

#endif //CHARACTER_HPP_INCLUDED

main.cpp

#include <iostream>
#include "character.hpp"
#include "monster.hpp"

using namespace std;

int main(int argc, char **argv)
{
    //Whatever
    return 0;
}

我从编译器得到这个错误:

In file included from character.hpp:7:0,  
                 from main.cpp:3:  
monster.hpp:24:16: error: 'Character' has not been declared  
   void attackC(Character& id);

(行号和列号可能是错误的)据
我了解,当monster.hpp包含在character.hpp中时,编译器看到类Monster使用了类Character,而在monster.hpp中尚未声明该类。 hpp 包含在 character.hpp 中。
我不知道如何解决这个问题。

有任何想法吗 ?

4

4 回答 4

3

这样做的方式是 char 和 monster 的头文件不相互包含。相反,您转发声明类并在 CPP 文件中包含标头。

所以基本上用 .cpp 替换#include "monster.hpp".hclass Monster;#include "monster.hpp".cpp - 其他类也一样。

有关更多详细信息,请参阅此问题:

什么是 C++ 中的前向声明?

于 2014-02-13T18:43:25.900 回答
0

在 *.h 中使用预先声明:

class Character;
class Monster;

在 *cpp 中使用包括:

#include "character.h"
#include "monster.h"

或者将所有内容放在一个带有预先声明的 *.hpp 中。

于 2014-02-13T18:47:24.333 回答
0
#ifndef INCLUDE_MONSTER_HPP
#define INCLUDE_MONSTER_HPP

#include "character.hpp"

class Character;

class Monster
{
  private: //Atributes

  public:  //Methods
    void attackM(Monster& id);
    void attackC(Character& id);
};

#endif //MONSTER_HPP_INCLUDED
于 2014-02-13T18:43:35.160 回答
0

您需要使用前向声明。见:http ://en.wikipedia.org/wiki/Forward_declaration

基本上,编译器不知道“字符”是什么。您可以通过将以下存根添加到 Character.hpp 来临时表明您可以指向它:

类字符;

于 2014-02-13T18:44:22.427 回答