2010-10-03 3 views
1

Je construis un projet C++ dans Eclipse en utilisant une implémentation tierce de gcc. Le fichier makefile est généré automatiquement et les règles d'objet sont listées par ordre alphabétique (je ne suis pas sûr que ce soit pertinent).Projet C++ et Eclipse - comment élaborer les en-têtes à inclure et la classe à transmettre

Je n'arrive pas à créer la configuration correcte des directives #include et des déclarations directes afin de les compiler. Je devine - et c'est clairement un mauvais cas de codage de poulet vaudou. Quelqu'un peut-il me dire comment je devrais travailler sur la commande d'inclusion? Le problème est que les classes se réfèrent l'une à l'autre (par exemple Display se réfère à Texture2D et vice versa).

je les fichiers suivants:

Display.cpp 
Display.h 

Display.h définit les classes suivantes:

class Canvas{ ... }; 
class Display 
{ 
public: 
    void PaintTexture(Texture2D * tex); 
    void WriteText(BitmapFont * fnt); 
private: 
    Canvas * c; 
}; 

et les fichiers:

Texture2D.h 
Texture2D.cpp 

Texture2D.h définit la classe suivante:

class Texture2D 
{ 
    void PaintTo(Canvas * c); 
}; 

et enfin les fichiers:

BitmapFont.h 
BitmapFont.cpp 

BitmapFont tel que défini dans BitmapFont.h fait référence à la fois Canvas et Texture2D;

class BitmapFont 
{ 
public: 
    void Paint(Canvas * c); 
private: 
    Texture2D * tex; 
}; 

main.cpp fait référence à BitmapFont et Texture2D.

Répondre

0

Si vous déplacez la classe Canvas à un nouvel en-tête, vous pouvez éviter les dépendances circulaires:

  1. Texture2D.h et display.h
  2. BitmapFont.h et display.h

ce faisant, l'arbre de dépendance deviendrait ceci:

|-- Canvas.h 
| |-- Nothing? :-) 
|-- Texture2D.h 
| |-- Canvas.h 
|-- BitmapFont.h 
| |-- Canvas.h 
| |-- Texture2D.h 
| | |-- Canvas.h 
|-- Display.h 
| |-- Canvas.h 
| |-- Texture2D.h 
| | |-- Canvas.h 
| |-- BitmapFont.h 
| | |-- Canvas.h 
| | |-- Texture2D.h 
| | | |-- Canvas.h 

Cela signifie:

Texture2D.h:

#include "Canvas.h" 

BitmapFont.h:

#include "Texture2D.h" 

display.h:

#include "Texture2D.h" 
#include "BitmapFont.h" 

Conclusion: pas de dépendances circulaires.

1

Diviser Canvas en en-tête séparé; et ont des déclarations avant pour Texture2D et BitmapFont dans display.h:

** Canvas.h

#ifndef CANVAS_H 
#define CANVAS_H 

class Canvas { 
public: 
    Canvas(); 
}; 

#endif 

display.h:

#ifndef DISPLAY_H 
#define DISPLAY_H 
#include "Canvas.h" 

class Texture2D; // Forward declaration 
class BitmapFont; // Forward decl 

class Display 
{ 
public: 
    void PaintTexture(Texture2D* tex); 
    void WriteText(BitmapFont* fnt); 
private: 
    Canvas * c; 
}; 
#endif 

Texture2D.h:

#ifndef TEXTURE2D_H 
#define TEXTURE2D_H 
#include "Canvas.h" 

class Texture2D 
{ 
    void PaintTo(Canvas * c); 
}; 
#endif 

BitmapFont.h:

#ifndef BITMAPFONT_H 
#define BITMAPFONT_H 

#include "Canvas.h" 
#include "Texture2D.h" 

class BitmapFont 
{ 
public: 
    void Paint(Canvas * c); 
private: 
    Texture2D * tex; 
}; 
#endif 

main.cpp:

#include "BitmapFont.h" 
#include "Texture2D.h" 

int main() { 
    BitmapFont bf; 
    Texture2D tex; 

    return 0; 
} 
+0

Mais le problème est que Display dépend aussi de Texture2D et BitmapFont. Au moins une déclaration avant est nécessaire. – aschepler

+0

est-ce que des déclarations prospectives sont nécessaires? – BeeBand

+0

Oui, vous faites! J'aurais une déclaration Canvas dans un Canvas.h séparé; inclure Canvas dans Display.h, Texture2D.h et BitmapFont.h. De plus, Display.h devra avoir des déclarations anticipées pour Texture2D et BitmapFont: – kartheek

0

Depuis que des pointeurs vers des objets de ces classes sont utilisées dans vos exemples, vous devriez être en mesure d'utiliser juste avant les déclarations en les fichiers d'en-tête. Vous pouvez essayer de déclarer class Canvas; dans BitmapFont.h et Texture2D.h et les deux class BitmapFont; et class Texture2D dans Display.h. Assurez-vous ensuite d'inclure tous les fichiers nécessaires dans chaque unité * .cpp. Comme l'a fait remarquer @jweyrich, vous pouvez probablement trouver une solution en utilisant certaines déclarations anticipées et quelques # croisés également.

Une meilleure solution, bien que plus de travail, serait de déplacer la définition de class Canvas dans son propre fichier. Puis BitmapFont.h et Texture2D.h pourraient juste #include "Canvas.h" et Display.h pourrait #include BitmapFont.h et Texture2D.h.

+0

@aschleper, hmm, 'BitmapFont' fait également référence à' Texture2D'. – BeeBand

+0

@BeeBand: Si vous le faites de cette manière avec toutes les déclarations directes, vous aurez probablement besoin des trois fichiers d'en-tête inclus dans chaque fichier * .cpp. Mais bien sûr, cela dépend du code qui est réellement dans ces fichiers. Si vous essayez de compiler et n'obtenez pas d'erreurs de compilation dans les en-têtes, vous progressez. Le message d'erreur gcc habituel qui signifie que vous devez ajouter un #include pour compléter une déclaration forward serait quelque chose comme "utilisation invalide de type incomplet". – aschepler

+0

Avec les nouvelles informations que BitmapFont.h fait référence à 'Texture2D', il semble que BitmapFont.h devrait inclure Texture2D.h. Ou si Texture2D.h finit par faire référence à 'BitmapFont', alors au moins l'un d'eux aura besoin d'une déclaration forward. – aschepler

Questions connexes