C++はヘッダファイルに含まれるものをできるだけ前置き宣言で置き換える

2061 ワード

cat kkk.txt llll.log>fjdskl.log grep  "fdsfdsa*"hhh.log>kkkk.txt
C++ヘッダファイル重複は、2つのクラスAとBがあり、それぞれのヘッダファイルA.hとB.hに定義されていると仮定しますが、AではB、BではAが使用されますが、このような書き方は当然間違っています.
class B;
class A
{
public:
    B b;
};

class B
{
public:
    A a;
};

AオブジェクトにはBに属する空間が開かれ、BにはAの空間があるため、論理的な誤りであり、実現できない.ここでは、AクラスのBタイプのメンバーをポインタ形式に変更するだけで、この無限に伸びる怪圏を避けることができます.なぜBではなくAを変更するのですか?Bで似たような動作をしても、コンパイルエラーが発生するため、これは前の順番の問題にすぎません.
どうしてこんなことになったの?C++コンパイラがソースファイルを上から下へコンパイルする場合、各データの定義には、定義されたデータ型のサイズが常に必要になるからです.あらかじめ文class Bを宣言する.その後、コンパイラはBがクラスであることを知っていたが、その中のデータは未知であるため、Bタイプのサイズも知らずにコンパイルに失敗し、VC++6.0では次のようなコンパイルエラーが得られる.
      error C2079: 'b' uses undefined class 'B'
二、異なるヘッダファイルのクラスのネスト
ヘッダファイルが一度だけコンパイルされることを保証するために、C++でよく使われる方法は
#IFNDEF  TESTSTR
#define TESTSTR
      //    
#endif

高バージョンのVC++では、以上のすべての代わりにこのコマンドを使用することもできます.
//  A.h    
#pragma once
#include "B.h"
class A
{
public:
    B* b;
};

//  B.h    
#pragma once
#include "A.h"
class B
{
public:
    A* a;
};

メイン関数の前に#include“A.h”を使用した後、主なコンパイルエラーは以下の通りである:error C 2501:'A':missing storage-class or type specifiers.依然としてタイプが見つからないエラーですが、ここでは前置き宣言が必要です.前の宣言をそれぞれ追加すると、次のようにコード形式をコンパイルできます.
//  A.h    
#pragma once
#include "B.h"
class B;
class A
{
public:
    B* b;
};

//  B.h    
#pragma once
#include "A.h"
class A;
class B
{
public:
    A* a;
};

これは、少なくとも、ヘッダファイルに代替できない前置き宣言が含まれていることを示すことができる.前置き声明でしか問題を解決できない場合があります.前置き声明があったときにヘッダファイルが含まれる必要があるのか、考えてみましょう.A.hとB.hの#include行を削除してみると、新しいエラーが発生していないことがわかりました.3、2点の原則的なヘッダファイルには、実際には煩わしい仕事が含まれています.疲れているだけでなく、コンパイラがコンパイルされているときも疲れています.また、ヘッダファイルによく現れるマクロ定義感は、さまざまなマクロ定義の展開に非常に時間がかかり、カスタム関数よりはるかに速くありません.1つ目の原則:ヘッダファイルを含まない場合は含まないでください.この場合、前置き宣言は問題を解決することができます.もし使用するのは1つのクラスのポインタだけで、このクラスの具体的なオブジェクト(ポインタではありません)を使用していない場合、クラスの具体的なメンバーにアクセスしていない場合は、ポインタというデータ型のサイズが特定であるため、前置き宣言すればいいです.コンパイラは知ることができる.第2の原則:ヘッダーファイルではなくCPPファイルにヘッダーファイルをできるだけ含める.