2010-05-25 3 views
0

J'ai eu un post similaire à celui-ci il y a quelque temps sur la base d'une erreur que je recevais. J'ai été en mesure de le réparer, mais depuis lors, j'ai eu du mal à faire les choses parce que les en-têtes empêchent les autres en-têtes d'utiliser le code. Honnêtement, ces en-têtes me déroutent et si quelqu'un a des ressources pour régler ce genre de problèmes, ce sera utile. Ce que je veux essentiellement faire, c'est pouvoir inclure rModel.h dans RenderEngine.h. Chaque fois que j'ajoute rModel.h à RenderEngine.h, rModel.h n'est plus capable d'utiliser RenderEngine.h. (rModel.h a aussi #include de RenderEngine.h).refactorisant mon code. Mes en-têtes (Header Guard Issues)

Donc, en un mot, RenderEngine et rModel doivent utiliser les fonctionnalités des autres. En plus de toute cette confusion, le Main.cpp doit utiliser RenderEngine.

stdafx.h

#include "targetver.h" 

#define WIN32_LEAN_AND_MEAN    // Exclude rarely-used stuff from Windows headers 
// Windows Header Files: 
#include <windows.h> 

// C RunTime Header Files 
#include <stdlib.h> 
#include <malloc.h> 
#include <memory.h> 
#include <tchar.h> 
#include "resource.h" 

main.cpp

#include "stdafx.h" 
#include "RenderEngine.h" 
#include "rModel.h" 

// Global Variables: 

RenderEngine go; 

rModel *g_pModel; 

...code........... 

rModel.h

#ifndef _MODEL_H 
#define _MODEL_H 
#include "stdafx.h" 
#include <vector> 
#include <string> 
#include "rTri.h" 
#include "RenderEngine.h" 

........Code 

RenderEngine.h

#pragma once 
#include "stdafx.h" 
#include "d3d10.h" 
#include "d3dx10.h" 
#include "dinput.h" 
#include "rModel.h" 

.......Code...... 
+1

rModel.h manque-t-il le #endif final? – pmr

+0

Je pense que ce n'est pas le problème principal ici) –

Répondre

5

Comme je l'ai écrit dans ma réponse précédente sur cette question, google sur Forward declaration en C++. Cela peut résoudre vos problèmes, mais, encore une fois, les dépendances d'en-tête circulaires indiquent une conception d'application médiocre.

+0

Oui je l'ai eu la dernière fois. J'essayais d'adopter une toute nouvelle approche à l'ensemble de la situation et d'obtenir une réponse plus précise. Là où il semble que le premier problème était basé sur une question ou une erreur particulière, il s'agissait d'une approche plus large de l'ensemble de la situation et des meilleures pratiques. Mais il semble que ce soit un problème commun et la déclaration Forward est la réponse évidente à ces types de situations. Je suppose que je vais poursuivre mes recherches. merci – numerical25

+0

Ok, donc je comprends que les déclarations directes sont comme des prototypes de fonctions. Ils retiennent jusqu'à la fin du document. Dans ce cas, je devrais mettre les deux classes dans le même document. Mais je me souviens que vous disiez que je pouvais mettre les en-têtes dans des documents séparés. Comment ferais-je cela? En ce moment j'ai eu la déclaration avant de rModel dans RenderEngine. Et j'ai une inclusion de RenderEngine.h dans rModel.h. Mais le fichier main.cpp a déjà déclaré RenderEngine.h alors RenderEngine.h dans rModel est ignoré. – numerical25

+0

Peu importe, je prends plusieurs approches différentes maintenant. J'ai enlevé le RenderEngine.h du principal.cpp et juste inclus rModel.h car il contient une déclaration de RenderEngine.h. Cela n'a pas réglé le problème. mais je pense que je suis en train de l'attraper. – numerical25

3

Au moins, si j'ai bien compris votre question, vous avez un petit problème. Vous avez fondamentalement besoin de structurer vos en-têtes de sorte que les inclusions forment un graphique acyclique dirigé (emphase sur acyclique). Ce que vous pourriez avoir à faire est de casser votre "renderengine.h" en deux morceaux, dont l'un contient seulement des déclarations en avant, et l'autre contient le reste de votre contenu actuel. Vous allez ensuite inclure cette en-tête "forward declarations" dans "rmodel.h", et inclure "rmodel.h" dans "renderengine.h".

Bien qu'il y ait des moments où cela est inévitable, une telle dépendance circulaire indique souvent un problème avec la façon dont vous avez organisé vos modules. Il est tout à fait possible que ce que vous avez actuellement comme renderengine.h et rmodule.h soit un en-tête unique, ou peut-être plusieurs en-têtes, mais cassé le long de lignes différentes.