J'obtiens cette erreur en traitant avec un certain nombre de classes dont l'autre:Tricky classe Héritage C de Définition du problème
error: expected class-name before '{' token
Je vois ce qui se passe, mais je ne sais pas comment corriger correctement, il . Voici une version abstraite du code:
A.h
#ifndef A_H_
#define A_H_
#include "K.h"
class A
{
public:
A();
};
#endif /*A_H_*/
A.cpp
#include "A.h"
A::A() {}
B.h
#ifndef B_H_
#define B_H_
#include "A.h"
class B : public A
{ // error: expected class-name before '{' token
public:
B();
};
#endif /*B_H_*/
B.cpp
#include "B.h"
B::B() : A() {}
J.h
#ifndef J_H_
#define J_H_
#include "B.h"
class J
{
public:
J();
};
#endif /*J_H_*/
J.cpp
#include "J.h"
J::J() {}
K.h
#ifndef K_H_
#define K_H_
#include "J.h"
class K : public J
{ // error: expected class-name before '{' token
public:
K();
};
#endif /*K_H_*/
K.cpp
#include "K.h"
K::K() : J() {}
main.cpp
#include "A.h"
int main()
{
return 0;
}
À partir de main.cpp, je peux déterminer que c'est ce que voit le compilateur :
#include "A.h"
#ifndef A_H_
#define A_H_
#include "K.h"
#ifndef K_H_
#define K_H_
#include "J.h"
#ifndef J_H_
#define J_H_
#include "B.h"
#ifndef B_H_
#define B_H_
#include "A.h"
class B : public A
{ // error: expected class-name before '{' token
Ainsi, Une définition de est pas terminée quand nous arriverons à B. On m'a dit que parfois vous devez utiliser une déclaration avant et ensuite déplacer l'instruction #include dans le fichier .cpp, mais je n'ai pas de chance avec ça. Si je tente quelque chose comme ça, je reçois simplement l'erreur supplémentaire:
error: forward declaration of 'struct ClassName'
Je pense que peut-être je ne suis pas faire les choses dans les bons endroits. Quelqu'un peut-il me montrer comment compiler ce code? Merci beaucoup!
Modifier: Je tiens à souligner que c'est juste une version abstraite du code réel.Je me rends compte qu'il n'y a pas de références à K dans A ou B dans J, mais il y a dans le code réel et je pense qu'ils sont tout à fait nécessaire. Peut-être que si je donne une brève description des vraies classes, quelqu'un peut m'aider à restructurer ou réparer mon code.
Classe est une classe de noeuds abstraite qui agit comme une interface pour les noeuds dans un graphique. Classe B est l'un de ce qui sera un certain nombre de différentes implémentations de A. De la même manière, la classe J est une classe Visiteur abstraite et K est l'implémentation correspondante. Voici le code avec un peu plus de contexte:
Ah (Résumé Node)
#ifndef A_H_
#define A_H_
#include "K.h"
class K;
class A
{
public:
A();
virtual void accept(const K&) const = 0;
};
#endif /*A_H_*/
A.cpp
#include "A.h"
A::A() {}
Bh (Noeud béton)
#ifndef B_H_
#define B_H_
#include "A.h"
class K;
class B : public A
{ // error: expected class-name before '{' token
public:
B();
virtual void accept(const K&) const;
};
#endif /*B_H_*/
B.cpp
#include "B.h"
B::B() : A() {}
void B::accept(const K& k) const { k.visit(this); }
J.h (Résumé Visiteur)
#ifndef J_H_
#define J_H_
#include "B.h"
class B;
class J
{
public:
J();
virtual void visit(const B*) const = 0;
};
#endif /*J_H_*/
J.cpp
#include "J.h"
J::J() {}
K.h (visiteur en béton)
#ifndef K_H_
#define K_H_
#include "J.h"
class B;
class K : public J
{ // error: expected class-name before '{' token
public:
K();
virtual void visit(const B*) const;
};
#endif /*K_H_*/
K.cpp
#include "K.h"
K::K() : J() {}
void K::visit(const B*) const {};
main.cpp
#include "A.h"
int main()
{
return 0;
}
je devais ajouter quelques déclarations avant de faire quelques erreurs supplémentaires qui sont apparues (quand j'ajouté en détail) allez-vous en. Certains d'entre eux peuvent ne pas être nécessaires ou corrects.
J'ai essayé ceci et j'ai obtenu l'erreur "déclaration de 'struct K'". J'ai ajouté plus de détails à ma question, alors j'espère que vous pourrez le réévaluer. – Scott
Je remarque que dans votre premier exemple vous avez le #include "K.h" et la classe K; ligne. Avez-vous essayé de supprimer la ligne #include ou est-ce juste un oubli dans votre message? –
Je ne comprends pas. Dans mon premier exemple? J'inclus K dans la classe A, mais il n'y a pas de déclaration forward. J'ai essayé de supprimer le "#include" et d'ajouter une déclaration avant comme vous l'avez dit, mais comme je l'ai dit, j'ai eu l'erreur: "déclaration avant de 'struct K'." – Scott