5

インクルードしたクラスをヘッダーファイルとして宣言するのはなぜですか?

#include "TreeCallObj.h"
#include "TreeDevObj.h"
#include "TreeDevCallObj.h"

class TreeCallObj; //what is the purpose of this line ?
class TreeDevObj;  //what is the purpose of this line ?
class TreeDevCallObj;  //what is the purpose of this line ?


class Apple
{
public:
...
private:
...
}
4

8 に答える 8

6

このことを考慮:

//a.h
#ifndef A_H
#define A_H

#include "b.h"
class A
{
   B* b;
};
#endif

//b.h
#ifndef B_H
#define B_H

#include "a.h"
class B
{
   A* a;
};
#endif

ここで、ファイルの1つを別のファイルに含めようとします#include "a.h"

コンパイラはそれを次のように解析します。

#ifndef A_H
#define A_H

罰金-A_H定義されていません

#include "b.h"

内容を貼り付けてみてください:

#ifndef B_H
#define B_H

B_H定義されていないのでわかりました

#include "a.h"

Aが定義されているため、これは定義されませんA_H。次に、

class B
{
   A* a;
};

A使用前に定義または宣言されていなかったため、エラーが発生します。

前方宣言はこれを修正します。

もちろん、これに対する最善の解決策は、まったく含めないことです(絶対に含める必要がない限り)。

于 2012-09-06T15:29:54.713 に答える
5

この行の目的は何ですか?

理想的には何もありません。余計です。

ただし、@ Luchian Grigoreが指摘したように、インクルードガードとクロスインクルードの誤った使用により、前方宣言が必要になるような不適切な設計のコードが存在する可能性があります。

于 2012-09-06T15:24:28.327 に答える
3

ファイルにクラスの定義がある場合forward declarationは、通常は不要です。

于 2012-09-06T15:23:32.090 に答える
1

あなたのヘッダーには複数の包含に対するガードがないことに気づきました。また、含まれている他のヘッダー(ヘッダーには通常そのようなガードがあります)の一部にそのヘッダーが含まれている可能性もあります。その結果、コンパイルされませんでした。そこで、誰かが間違ったバグを修正するために前方宣言を追加しました。

于 2012-09-06T15:33:17.053 に答える
1

理由はまったくありません。状況に応じて、どちらか一方を実行する必要がありますが、両方を実行する必要はありません。

于 2012-09-06T15:24:32.423 に答える
1

現状では、必要はありません。

ただし、これは歴史的に進化した可能性があります。ある時点で、不完全なタイプで十分だった可能性があります。

class Foo;

struct Gizmo
{
    void f(Foo);
};

その後、著者は完全なタイプが必要であると判断しました。

#include "Foo.hpp"

class Foo;

struct Gizmo
{
    void f(Foo);
    Foo x;
};

元のコードは、今必要なヘッダーを含めて修正された可能性があります...

于 2012-09-06T15:28:29.313 に答える
1

これにはいくつかの歴史があると思います。当初、コーダーはヘッダーファイルをインクルードしないように試み、代わりに前方宣言を使用していました。その後、コードを展開すると、結局ヘッダーファイルが必要であることがわかりましたが、前方宣言を削除する必要はありませんでした。

他の人が言っているように、クラス宣言の後に前方宣言をする目的はありません。

于 2012-09-06T15:29:00.953 に答える
0

ヘッダーファイルが正しければ、ヘッダーですでに宣言されているはずなので、宣言しても意味がありません。

于 2012-09-06T15:28:12.903 に答える