2017-07-31 6 views
0

J'ai une erreur dans mon code. Tous les forums dit "dans cette situation, utilisez la déclaration Forward". J'ai essayé cela et ça ne marche pas.Déclaration avant: classe non définie (C2079)

l'erreur est C2079 Credit :: mainMenu utiliser une classe de MainMenu pas déclaré (traduit du français)

J'ai modifié le classe pour être spécifique à la question.

main.cpp

#include <SFML/Graphics.hpp> 

#include "Menu.h" 

#include "credit.h" 
#include "mainmenu.h" 


MainMenu *mainMenu = new MainMenu();//works here 

int main(){ 
    return 0; 
} 

credit.h

#ifndef DEF_CREDIT 
#define DEF_CREDIT 

#include <SFML/Graphics.hpp> 
#include "Menu.h" 
class MainMenu; 


class Credit : public Menu 
{ 
private: 
    MainMenu mainMenu = MainMenu();//DON'T WORK HERE 
}; 

#endif 

mainmenu.h

#ifndef DEF_MAINMENU 
#define DEF_MAINMENU 

#include <SFML/Graphics.hpp> 
#include "Menu.h" 
#include "credit.h" 

class MainMenu :public Menu 
{ 
private: 
    Credit credit = Credit();//work 
}; 
#endif 

Fist i charge main.cpp après la credit.h (il y a un credit.hpp mais je ne pas utiliser la variable maintenant) après la mainmenu.h (il y a aussi un mainmenu.hpp, je ne pas utiliser la variable maintenant)

astuce: la classe Menu n'inclut pas une de ces classes

Je peux vous envoyer le code complet si vous voulez

Merci à advence!

+0

La déclaration directe ne peut être utilisée que pour les pointeurs (ou références) de ladite classe (par exemple MainMenu * mainMenu;) Sinon, la taille de la classe Credit ne peut pas être calculée au moment de la compilation. –

+1

Quelle serait la taille de 'MainMenu' ou' Credit'? Vous devez utiliser un pointeur. – Jarod42

+0

Homm ok, merci, je vais essayer avec des pointeurs –

Répondre

0

Ce problème est connu sous le nom circular dependency. Longue histoire courte, deux objets jamais ont un autre comme sous-objet.

Au lieu de cela, vous avez deux options. L'un est d'avoir un point de à un autre

class Credit : public Menu 
{ 
private: 
    MainMenu* mainMenu; 
}; 

Ou, vous pourriez avoir un gestionnaire de toutes sortes, où seul le gestionnaire est conscient des deux objets, et laissez-les interagir via le gestionnaire

class Manager 
{ 
private: 
    Credit credit; 
    MainMenu mainMenu; 
}; 

Pour la raison technique, vous ne pouvez pas avoir un membre d'un type déclaré mais non défini parce que c'est un type incomplet, et vous ne pouvez pas avoir un objet de type incomplet.

+0

Humm si je crée une classe de gestionnaire, j'ai besoin de l'importer dans ma classe credit.h aussi et j'ai une boucle d'en-tête: (comment puis-je résoudre ceci? –

+0

ok cela fonctionne quand je place dans les pointeurs en public et le déclare dans le principal.cpp –

+0

Comme Algirdas Preidžius a dit 'MainMenu * mainMenu = nouveau MainMenu();' ne fonctionnera pas si 'MainMenu' est un type incomplet. – NathanOliver