Pergunta

The title might not be very clear, it's a bit more complex than that. I searched the web for something like my problem but I did not find anything that could help me.
This is not about infinite looping inclusions, I already put preprocessor directives to avoid that.

I have two classes Monster and Character, respectively declared in their own header files, monster.hpp and character.hpp, and respectively implemented in their own source files, monster.cpp and character.cpp.
The problem now is that both classes need each other to work.

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

and the main.cpp :

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

using namespace std;

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

And I get this error from the compiler :

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);

(the line and column numbers may be wrong)
From what I understand, when monster.hpp is included into character.hpp, the compiler sees that the class Monster uses the class Character, which is not declared yet right at the moment when monster.hpp is included into character.hpp.
And I don't know how to fix that.

Any ideas ?

Foi útil?

Solução

The way this works is that the header files of char and monster do not include each other. Instead you forward declare the classes and include the headers within the CPP files.

So basically replace #include "monster.hpp" in the.h with class Monster; and #include "monster.hpp" in the .cpp - and same for the other class.

See this question for more details:

What are forward declarations in C++?

Outras dicas

#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

You need to use a forward declaration. See: http://en.wikipedia.org/wiki/Forward_declaration

Basically, the compiler doesn't know what a "Character" is. You temporarily indicate that it's something you can point to by adding the following stub to Character.hpp:

class Character;

Use predeclaration in *.h:

class Character;
class Monster;

use in *cpp the includes:

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

Or put everything in one *.hpp with predeclaration.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top