Forward d�clarations et namespaces
Bonjour,
Je rencontre un gros probl�me d'utilisation de forward d�clarations et de namespaces (avec utilisation de singleton), et si quelqu'un pouvait �clairer ma lanterne, �a serait super (� savoir: je suis exp�riment� en C++, mais l�, je s�che b�tement)
Voici mon probl�me:
J'ai 2 fichiers Animal.hpp et Animal.cpp.
Dans Animal.hpp:
Code:
1 2 3 4 5 6 7 8 9 10 11
|
namespace LeMondeDesAnimaux
{
class Animal
{
public:
Animal();
virtual ~Animal();
virtual void Manger()=0; // virtuelle pure
};
}; |
Dans le fichier Animal.cpp, les impl�mentations de Animaux et de classes classes h�rit�es (d�clar�es ici volontairement, car pas besoin de mettre ces classes dans l'interface de ma lib):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
namespace LeMondeDesAnimaux
{
class Lion: public Animal
{
public :
virtual ~Lion();
virtual void Manger();
static Animal* GetInstance(); // singleton
private:
Lion();
};
};
using namespace LeMondeDesAnimaux;
Animal::Animal()
{}
Animal::~Animal()
{}
Lion::Lion() {}
Lion::~Lion() {}
void Lion::Manger() {}
Animal* Lion::GetInstance()
{
static Lion monInstance;
return &monInstance;
} |
Rien de bien m�chant jusque l� (j'ai all�g� en virant les #ifndef ANIMAL_HPP dans mon code donn� ici pour ne pas vous alourdir la lecture).
Viennent ensuite les fichiers Lieu.hpp et Lieu.cpp:
Dans Lieu.hpp:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include Animal.hpp
namespace LeMondeDesAnimaux
{
class Lieu
{
public:
Lieu();
virtual ~Lieu();
virtual void Ouvrir() = 0; // virtuel pure!
protected:
Animal* m_pCages[3]; // j'ai 3cages, avec des animaux dans chacun, qui sont donnés à la construction
};
}; |
et Lieu.cpp:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
#include "Lieu.hpp"
namespace LeMondeDesAnimaux
{
class Zoo : public Lieu
{
public:
Zoo();
virtual ~Zoo();
virtual void Ouvrir();
};
}; // fin namespace
using namespace LeMondeDesAnimaux;
Lieu::Lieu()
{
m_pCages[0]=0;
m_pCages[1]=0;
m_pCages[2]=0;
}
Lieu::~Lieu()
{
}
Zoo::Zoo()
{
m_pCages[0]=Lion::GetInstance();
m_pCages[1]=0;
m_pCages[2]=0;
}
Zoo::~Zoo()
{
}
void Zoo::Ouvrir()
{} |
Comme vous le voyez, je fais r�f�rence, dans un fichier cpp (Lieu.cpp), � une class dont la d�finition est donn�e dans un autre fichier cpp (Animal.cpp).
Quand je compile, j'obtiens un message d'erreur sur Lion::GetInstance() :
"Lion : must be a class or namespace"
OK, je fais de la forward d�claration... donc avant la ligne de constructeur Zoo::Zoo(), j'ajoute:
Nouvelle erreur sur Lion::GetInstance() :
"Incomplete type is not allowed"
OK... je me dis que ma forward d�claration devrait sp�cifier le namespace, donc je la fais plus haut, avant le using namespace, en �crivant:
Code:
1 2 3 4 5
|
namespace LeMondeDesAnimaux
{
class Lion;
}; |
M�me erreur!!
Quelqu'un aurait-il une id�e � la question, qui se r�sume donc �:
Comment, dans un fichier A.cpp, dans le namespace N, faire r�f�rence � une classe d�finie uniquement dans un autre fichier B.cpp et appartenant au m�me namespace N? Quelle forme doit prendre la forward d�claration et l'utilisation de la classe dans le fichier A.cpp?
Si vous avez une id�e, �a me sauverait bien...
Merci d'avance pour vos r�ponses
Nicolas