私は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ファイルに追加する必要があります。
'CDirectory.hpp'が最初に展開されましたが、' CNode'を宣言していませんでした。 – feersum
円形のインクルード問題があります。ヘッダー内の前方宣言だけを使用し、完全インクルードは使用しないでください。 –
アンダースコアと大文字で始まる識別子は実装のために予約されています。それらを自分で定義すると、プログラムが不正になります。 – user2079303