2014-02-13 148 views
2

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

我有两个类怪物和角色,在自己的头文件分别宣布,monster.hppcharacter.hpp,并在自己的源文件分别实施,monster.cpp字符.cpp
现在的问题是,两个类都需要彼此的工作。

monster.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 

character.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; 
} 

而且我得到这个电子RROR从编译器:

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.hpp包含在character.hpp中时,它还没有被声明。
而我不知道如何解决这个问题。

任何想法?

回答

3

这样做的方式是char和monster的头文件不包含对方。相反,您需要声明这些类并在CPP文件中包含标题。

因此,基本上将.h中的#include "monster.hpp"替换为.cpp中的class Monster;#include "monster.hpp" - 对于其他类也是如此。

看到这个问题的更多细节:

What are forward declarations in C++?

+0

哇,我没有想到,即使我已经使用它的功能。那么我现在感觉很蠢x)谢谢! – qreon

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 
0

您需要使用预先声明。请参阅:http://en.wikipedia.org/wiki/Forward_declaration

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

class Character;

0

在*中使用predeclaration。H:在* CPP的

class Character; 
class Monster; 

用途包括:

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

或者把一切都放在一个* .HPP与predeclaration。