-1

J'essaie de modéliser des objets de fichiers en C++. Je vois tous les objets du fichier comme des "nœuds" représentés par une classe CNode. Ces nœuds peuvent être des fichiers ou des répertoires représentés respectivement par CFile et CDirectory qui héritent de la classe CNode. Quel que soit le type de noeud d'un noeud, je souhaite qu'il contienne un handle pour l'objet CDirectory qui représente le répertoire parent du noeud. Il y a donc 2 vues à ne pas confondre: 1. la vue de programmation qui voit CFile et CDirectory hériter de la classe parente CNode 2. la vue du monde réel qui voit les fichiers et répertoires situés dans un répertoire parent (fyi, fichiers/répertoires situé à la racine aurait un handle CDirectory NULL pour des raisons évidentes)Classe de base contenant le pointeur de type dérivé

La grande idée est que lorsqu'un objet CFile ou CDirectory est instancié avec un chemin, par exemple, /path/to/my/file.txt, si le répertoire "to" n'existe pas, il sera créé avec les sous-répertoires et le fichier nommé dans le chemin. Lors de la destruction, les répertoires/fichiers qui ont été créés par l'objet seront supprimés en laissant le système de fichiers dans l'état dans lequel il se trouvait avant d'utiliser ces objets - à une condition. La condition est que si le fichier "fichier.txt", dans cet exemple, a été écrit, "fichier.txt" et les répertoires qui ont été créés dans le processus de création "fichier.txt" ne seront pas supprimés. Pour implémenter ce comportement, l'objet CFile représentant "file.txt" utilisera le CDirectory * hérité de sa classe de base (CNode) et appellera son "setWrittenToFlag()" qui appellera récursivement la même méthode pour le répertoire parent du parent. etc. C'est une méthode qui est seulement incluse dans la classe CDirectory, donc il est important que chaque nœud ait un handle pour son répertoire parent afin qu'il puisse appeler cette méthode.

Tout a été codé, mais je ne peux pas le compiler pour une raison comme en témoigne ce code:

CNode.hpp:

#ifndef _CNode_HPP_ 
#define _CNode_HPP_ 

#include "CDirectory.hpp" 


class CDirectory; 

class CNode 
{ 
private: 
    CDirectory * b; 
}; 

#endif 

CDirectory.hpp:

#ifndef _CDirectory_HPP_ 
#define _CDirectory_HPP_ 

#include "CNode.hpp" 


class CDirectory : public CNode 
{ 
}; 

#endif 

main.cpp:

#include <iostream> 
#include "CNode.hpp" 
#include "CDirectory.hpp" 


int main() 
{ 
    CDirectory dir; 

    return EXIT_SUCCESS; 
} 

Cela produit l'erreur de compilation suivante:

CDirectory.hpp:8: error: expected class-name before ‘{’ token 

En combinant les 2 fichiers .hpp obtient le code à compiler, mais conformément aux normes, je voudrais les garder séparés. Comment puis-je faire fonctionner cela? Y a-t-il un meilleur design? Je suis à la recherche de solutions OOD élégantes seulement - je ne veux pas lancer à moins que ce ne soit logique. Supposons que chaque classe a des méthodes spécifiques à ce type de classe/noeud et que je ne veux pas combiner des classes ou quelque chose comme ça.

EDIT: Merci pour la réponse rapide les gars! La solution s'est avérée être d'enlever le #include "CDirectory.hpp" du CNode.hpp puisque la déclaration de forward est là mais cela cause des problèmes dans les fichiers .cpp qui incluaient "CNode.hpp" et par la suite "CDirectory.hpp "puisque" CDirectory.hpp "n'est plus là - vous devez donc ajouter cette ligne #include" CDirectory.hpp "à ces fichiers .cpp individuels.

+0

'CDirectory.hpp' est développé en premier, mais vous n'avez pas renvoyé la déclaration' CNode'. – feersum

+0

Vous avez un problème d'inclusion circulaire. Vous devriez simplement utiliser la déclaration forward dans l'en-tête et pas un include complet. –

+0

Les identifiants commençant par le caractère de soulignement et la lettre majuscule sont réservés à la mise en œuvre. Les définir vous-même rend votre programme mal formé. – user2079303

Répondre

2

N'incluez pas CDirectory.h dans votre CNode.h. En l'incluant, vous forcez le compilateur à voir la définition de CDirectory, qui est un enfant de CNode, avant de voir la définition CNode.Il suffit de renvoyer le CDirectory comme vous le faites déjà.

+0

Ceci est correct mais pour ajouter, vous ne supprimez pas simplement la ligne "#include CDirectory.hpp" de CNode.hpp, vous l'avez déplacé de CNode.hpp vers les fichiers qui utilisent la fonctionnalité de CDirectory comme CNode. cpp et CFile.cpp. –