2016-05-26 21 views
-1

私はC++でファイルオブジェクトをモデル化しようとしています。私はすべてのファイルオブジェクトをCNodeクラスで表現される "ノード"と見なします。これらのノードは、CNodeクラスを継承したCFileおよびCDirectoryで表されるファイルまたはディレクトリのいずれかになります。派生型のポインタを含む基本クラス

ノードのノードの種類に関係なく、ノードの親ディレクトリを表すCDirectoryオブジェクトのハンドルが必要です。したがって、混乱させるべきではない2つのビューがあります: 1.親クラスのCNodeから継承するCFileとCDirectoryを見ているプログラミングビュー 2.親ディレクトリにあるファイルとディレクトリを見る実世界のビュー(fyi、files/directories

大きなアイデアは、CFileオブジェクトまたはCDirectoryオブジェクトが/path/to/my/file.txtなどのパスでインスタンス化されている場合です。if "to"ディレクトリは存在しないため、パスに指定されたサブディレクトリとファイルとともに作成されます。破棄すると、オブジェクトによって作成されたディレクトリ/ファイルは削除され、これらのオブジェクトを使用する前の状態にファイルシステムが残されます。条件は、この例のファイル "file.txt"が "file.txt"に書き込まれ、 "file.txt"の作成プロセスで作成されたディレクトリが削除されないという条件です。 この動作を実装するには、 "file.txt"を表すCFileオブジェクトは、基本クラス(CNode)から継承し、その親の親ディレクトリに対して同じメソッドを再帰的に呼び出す "setWrittenToFlag()"を呼び出すCDirectory *等々。これはCDirectoryクラスにのみ含まれるメソッドなので、各ノードが親ディレクトリのハンドルを持ってこのメソッドを呼び出すことが重要です。

すべてが符号化されているが、私は、このコードによって示されるように、それは一つの理由のためにコンパイルすることができません。

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

これは、次のコンパイルエラーを生成します。2つの.HPPファイルを組み合わせる

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

は、コンパイルするコードを取得しますが、標準規格に合わせて、私は分離されたそれらを維持したいと思います。これをどうやって動かすことができますか?より良いデザインはありますか?私はエレガントなOODソリューションだけを探しています - 私はそれが意味を成さない限り、キャストしたくありません。 各クラスには、そのクラス/ノード型に固有のメソッドがあるので、クラスなどを結合したくないとします。

編集: クイックレスポンスをお寄せいただきありがとうございます。解決策は、前方宣言がそこにあるので、CNode.hppから#include "CDirectory.hpp"を削除することが判明したが、これは "CNode.hpp"を含む.cppファイルに問題を引き起こし、その後 "CDirectory.hpp" "CDirectory.hpp"はもはや存在しないので、#include "CDirectory.hpp"行を個々の.cppファイルに追加する必要があります。

+0

'CDirectory.hpp'が最初に展開されましたが、' CNode'を宣言していませんでした。 – feersum

+0

円形のインクルード問題があります。ヘッダー内の前方宣言だけを使用し、完全インクルードは使用しないでください。 –

+0

アンダースコアと大文字で始まる識別子は実装のために予約されています。それらを自分で定義すると、プログラムが不正になります。 – user2079303

答えて

2

CNode.hCDirectory.hを含めないでください。それを含めることによって、CNodeの子であるCDirectoryの定義がコンパイラに表示され、CNodeの定義が見えるようになります。

あなたがすでにやっているように、ちょうどforward-declare CDirectoryです。

+0

これは正しいですが、追加するには、 "#include CDirectory.hpp"行をCNode.hppから削除するだけでなく、CNode.hppからCNodeのようなCDirectoryの機能を使用するファイルに移動します。 cppとCFile.cpp。 –

関連する問題