私は C++ を初めて使用し、作成した 2 つの .h ファイルをインクルードしようとしています。インクルードは相互にアクセスするため、順序に応じて、失敗または失敗に含めます。このため、考えられる唯一の問題は、「$ g++ main.cpp foo1.cpp foo2.cpp」をコンパイルするときに、読み取りに失敗することであることがわかっています。#IFnDef を使用したのは、別の投稿で問題が解決したことを確認したためですが、何も変わりませんでした。何か案は?
1 に答える
これまで見てきたように、2 つのヘッダーを互いにインクルードすることはできません。ディレクティブ#include
は基本的に「そのファイルの内容を取得し、ここに貼り付けたふりをする」ことを意味することに注意してください。header1.h
の内容をheader2.h
最初header2.h
に含めると言うが、最初に の内容を含めるheader1.h
と言い、 header1.h
(再び)最初に含めると言う場合header2.h
... アイデアが得られます。
#define
/#ifndef
トリック (「 インクルード ガード 」と呼ばれる)は、各ヘッダーのインクルードを 1 回だけ許可することで無限再帰を回避しますが、これは、コンパイラが の内容のheader1.h
後に の内容が続くかheader2.h
、またはその逆の内容を確認することを意味します。各ヘッダーのコードが他のヘッダーで定義されているものに依存している場合、いずれにしても、後で定義されていないものを参照するコードになってしまいます。
「前方宣言」と呼ばれるものを使用して、循環依存関係を回避できる場合があります。後で完全に定義されないものを宣言します。例えば:
// header1.h
#ifndef HEADER1_H
#define HEADER1_H
class Foo; // Declaration only
class Bar { // Definition
private:
// You can have a pointer to a type that's only declared, not defined.
Foo *p_foo;
// ...
};
#endif // ndef HEADER1_H
----
// header2.h
#ifndef HEADER2_H
#define HEADER2_H
#include "header1.h"
class Foo { // Definition
private:
// This requires class Bar to be defined, but that's OK, because it is.
Bar bar;
// ...
};
#endif // ndef HEADER2_H
この例では、 classの定義は必要なく、宣言のみが必要なため、header1.h
を含めるheader2.h
必要はありません。(つまり、コンパイラは、呼び出されたクラスが存在することを知る必要があるだけで、そのメンバーについてはまだ知る必要はありません。)Foo
Foo