2016-05-26 11 views
-1

Ich versuche, Dateiobjekte in C++ zu modellieren. Ich zeige alle Dateiobjekte als "Knoten" an, die durch eine CNode-Klasse repräsentiert werden. Diese Knoten können entweder Dateien oder Verzeichnisse sein, die durch CFile bzw. CDirectory repräsentiert werden, die von der CNode-Klasse erben.Basisklasse mit Zeiger des abgeleiteten Typs

Unabhängig vom Typ des Knotens, den ein Knoten hat, möchte ich, dass er ein Handle für das CDirectory-Objekt hat, das das übergeordnete Verzeichnis des Knotens repräsentiert. Es gibt also zwei Ansichten, die nicht zu verwechseln sind: 1. die Programmieransicht, in der CFile und CDirectory von der übergeordneten Klasse CNode erben 2. die reale Ansicht, in der Dateien und Verzeichnisse in einem übergeordneten Verzeichnis angezeigt werden (fyi, files/directories (aus naheliegenden Gründen)

Die große Idee ist, dass wenn ein CFile-Objekt oder CDirectory-Objekt mit einem Pfad instanziiert wird, zum Beispiel /path/to/my/file.txt, wenn Das Verzeichnis "to" existiert nicht, es wird zusammen mit den Unterverzeichnissen und der Datei erstellt, die im Pfad angegeben sind. Bei der Zerstörung werden die Verzeichnisse/Dateien, die vom Objekt erstellt wurden, gelöscht, wobei das Dateisystem in dem Zustand verbleibt, in dem es sich befand, bevor diese Objekte verwendet wurden - unter einer Bedingung. Die Bedingung ist, dass, wenn die Datei "file.txt" in diesem Beispiel geschrieben wurde, "file.txt" und die Verzeichnisse, die beim Erstellen von "file.txt" erstellt wurden, nicht gelöscht werden. Um dieses Verhalten zu implementieren, verwendet das CFile-Objekt, das "file.txt" darstellt, das CD-Verzeichnis *, das es von seiner Basisklasse (CNode) erbt und ruft "setWrittenToFlag()" auf, das rekursiv die gleiche Methode für das übergeordnete Verzeichnis des Parents aufruft und so weiter. Dies ist eine Methode, die nur in der CDirectory-Klasse enthalten ist, so dass es wichtig ist, dass jeder Knoten ein Handle für sein übergeordnetes Verzeichnis hat, damit er diese Methode aufrufen kann.

Alles wurde codiert, aber ich kann es nicht aus irgendeinem Grund zu kompilieren erhalten, wie durch diesen Code demonstriert:

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; 
} 

Daraus ergibt sich die folgende Kompilierungsfehler:

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

Die Kombination der 2 .hpp Dateien bekommt den Code zu kompilieren, aber mit Standards im Einklang würde Ich mag sie getrennt zu halten. Wie kann ich das funktionieren lassen? Gibt es ein besseres Design? Ich suche nur nach eleganten OOD-Lösungen - ich möchte nicht casten, solange es nicht Sinn macht. Angenommen, jede Klasse verfügt über Methoden, die für diese Klasse/diesen Knotentyp spezifisch sind, und deshalb möchte ich keine Klassen oder ähnliches kombinieren.

EDIT: Danke für die schnelle Antwort Jungs! Die Lösung bestand darin, #include "CDirectory.hpp" aus der Datei CNode.hpp zu entfernen, da die Forward-Deklaration vorhanden ist, dies jedoch Probleme in den CPP-Dateien verursacht, die "CNode.hpp" und anschließend "CDirectory.hpp" enthielten "Da" CDirectory.hpp "nicht mehr da ist, müssen Sie diese #include" CDirectory.hpp "-Zeile zu diesen einzelnen .cpp-Dateien hinzufügen.

+0

'CDirectory.hpp' wird zuerst erweitert, aber Sie haben 'CNode' nicht weiterleiten deklariert. – feersum

+0

Sie haben zirkuläre Include-Probleme. Sie sollten nur die Forward-Deklaration in der Kopfzeile und nicht ein vollständiges Include verwenden. –

+0

Bezeichner, die mit Unterstrich und Großbuchstaben beginnen, sind für die Implementierung reserviert. Wenn Sie sie selbst definieren, wird Ihr Programm schlecht dargestellt. – user2079303

Antwort

2

Nicht enthalten CDirectory.h in Ihrem CNode.h. Indem Sie es einbeziehen, erzwingen Sie Compiler, um die Definition von CDirectory zu sehen, die ein Kind von CNode ist, bevor CNode Definition gesehen wird.

Nur vorwärts-deklarieren CDirectory, wie Sie bereits tun.

+0

Das ist richtig, aber um es hinzuzufügen, entfernen Sie nicht nur die Zeile "#include CDirectory.hpp" aus CNode.hpp, Sie haben es aus CNode.hpp in die Dateien verschoben, die die Funktionalität von CDirectory wie CNode verwenden. cpp und CFile.cpp. –