1

私は C++ を初めて使用し、作成した 2 つの .h ファイルをインクルードしようとしています。インクルードは相互にアクセスするため、順序に応じて、失敗または失敗に含めます。このため、考えられる唯一の問題は、「$ g++ main.cpp foo1.cpp foo2.cpp」をコンパイルするときに、読み取りに失敗することであることがわかっています。#IFnDef を使用したのは、別の投稿で問題が解決したことを確認したためですが、何も変わりませんでした。何か案は?

4

1 に答える 1

2

これまで見てきたように、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必要はありません。(つまり、コンパイラは、呼び出されたクラスが存在することを知る必要があるだけで、そのメンバーについてはまだ知る必要はありません。)FooFoo

于 2013-11-21T07:21:46.250 に答える