2010-08-28 6 views
4

Ma première suspicion était qu'il y avait une dépendance circulaire dans mon code et est passé par Resolve header include circular dependencies. Mais cela n'a pas résolu mes erreurs de compilation. Voici le code avec 3 classes - A, G & N.dépendance circulaire (?) En C++

//A.h 

#ifndef A_H_ 
#define A_H_ 

class com::xxxx::test::G; 

namespace com { namespace xxxx { namespace test { 

class A { 

public: 
A(); 
~A(); 
void method1(void); 

private: 
G* g; 
}; 

} } } 

#endif /* A_H_ */ 


//A.cpp 

#include "A.h" 
#include "G.h" 

namespace com { namespace xxxx { namespace test { 

A::A() { 
g = new com::xxxx::test::G(); 
} 

A::~A() { 
delete g; 
} 

void A::method1() { 
g->method2(*this); 
} 

} } } 


//G.h 

#ifndef G_H_ 
#define G_H_ 

class com::xxxx::test::A; 

namespace com { namespace xxxx { namespace test { 

class G { 
public: 
void method2(const A&); 
}; 

} } } 

#endif /* G_H_ */ 


//G.cpp 

#include "N.h" 

namespace com { namespace xxxx { namespace test { 

void G::method2(const A& a) { 
N n(a, *this); 
} 

} } } 


//N.h 

#ifndef N_H_ 
#define N_H_ 

#include "A.h" 
#include "G.h" 

namespace com { namespace xxxx { namespace test { 

class N { 
public: 
N(const A& obj1, const G& obj2) : a(obj1), g(obj2) {} 
void method3(void); 

private: 
A a; 
G g; 
}; 

} } } 

#endif /* N_H_ */ 

Je reçois environ 10 erreurs de compilation dans Ah et je A.cpp la liste des erreurs de compilation ci-dessous:

./src/A.h:11: error: 'com' has not been declared 
../src/A.h:25: error: ISO C++ forbids declaration of 'G' with no type 
../src/A.h:25: error: invalid use of '::' 
../src/A.h:25: error: expected ';' before '*' token 
../src/A.cpp: In constructor 'com::xxxx::test::A::A()': 
../src/A.cpp:16: error: 'g' was not declared in this scope 
../src/A.cpp: In destructor 'com::xxxx::test::A::~A()': 
../src/A.cpp:20: error: 'g' was not declared in this scope 
../src/A.cpp: In member function 'void com::xxxx::test::A::method1()': 
../src/A.cpp:24: error: 'g' was not declared in this scope 

Qu'est-ce que pourrait être l'erreur dans le code ci-dessus?

Nous vous remercions à l'avance,
Cordialement,
raghava.

+6

S'il vous plaît ne pas écrire Java en C++ :( – kennytm

+0

@KennyTM: Quel est java-like à ce sujet? La convention de nommage? –

+1

@KennyTM: Je dois admettre que je viens de Java et a commencé à travailler sur ce projet récemment. mon commentaire sur le post de Potatoswatter – Raghava

Répondre

9

La déclaration avant

class com::xxxx::test::G; 

est illégale. Les membres d'un espace de noms doivent être déclarés dans celui-ci. De plus, comme Kenny le dit, les espaces de noms ne sont pas utilisés comme ça en C++. À moins que votre projet soit distribué en tant que bibliothèque ou qu'il soit de taille raisonnablement grande (des dizaines de fichiers au minimum), vous n'avez probablement pas besoin de votre propre espace de noms.

+1

@Potatoswatter: Quelle est cette critique sur les espaces de noms? Je ne comprends pas – sbi

+1

@sbi: ça vous encourage à mettre simplement 'using namespace' partout, et vous vous retrouvez avec tout dans le même namespace Une structure simple et plate (comme toute la lib std qui se trouve dans l'espace de noms 'std') signifie que les gens vont * respecter * l'espace de noms, plutôt que d'essayer de s'en débarrasser, comme dans .NET ou Java vous avez des heirarchies profondes et verbeuses – jalf

+0

@jalf: Donc la critique concerne autant d'espaces de noms imbriqués? o cela, bien que [je crois fermement en explicitement épeler tous les espaces de noms] (http: // stackoverflow.com/questions/2879555/c-stl-how-to-write-wrappers-pour-cout-cerr-cin-et-endl/2880136 # 2880136) et pense que cela semble seulement un problème pour tant de développeurs parce que tous les livres et les articles omettent cela. – sbi

2

Est-ce que class com::xxxx::test::G; est légal en C++? Je l'ai écrit:

namespace com { 
    namespace xxxx { 
     namespace test { 
      class G; 
     } 
    } 
} 
5

Lorsque le compilateur essaie de compiler a.cop, la première chose qu'il rencontre (inclus de ah) est la suivante:

class com::xxxx::test::G; 

A ce stade, il n'y a rien à dire le compilateur ce que exactement com, xxxx et test sont. Chacun d'entre eux peut être un espace de noms ou une classe. Cela signifie également que G n'est pas clair, ce qui conduit à toutes les autres erreurs.

+0

Merci, c'était une bonne explication – Raghava

2

Comme d'autres l'ont souligné, l'utilisation de class com::xxxx::test::G; est illégale.

La conversion plus simple est (conservation-ness en ligne):

namespace com { namespace xxxx { namespace test { class G; } } } 

Je préfère cette façon de l'avant de déclarer que « grep » ne montre pas la portée, alors que cette syntaxe immédiatement étalez pour tous.

Questions connexes