4

別のヘッダーのファイルで宣言を転送することは合法ですか? 例えば:

#ifndef _MAIN_H_
#define _MAIN_H_
class ClassA;
class ClassB;
#include "classa.h"
#include "classb.h"
#endif

#ifndef _CLASSA_H_
#define _CLASSA_H_
#include "main.h"
class ClassA
{
public:
    ClassB b;
};
#endif

#ifndef _CLASSB_H_
#define _CLASSB_H_
#include "main.h"
class ClassB
{
public:
    ClassA a;
};
#endif

クラス A とクラス B は互いに依存しており、どちらも別の型のオブジェクトを持っています。私がしたことは、別のファイルで両方のクラスを前方宣言することでした。これを行うためのきれいな方法はありますか?

4

2 に答える 2

3

はい。ただし、 のサイズを計算するためのサイズに関する情報がないため、(cppファイルの対応する初期化を使用してClassA* a;)またはClassA& a;の代わりに使用する必要があります。ClassA a;ClassAClassB

于 2012-04-21T18:19:35.730 に答える
3

一般に、ヘッダー間でクラスを前方宣言することは合法です。

ただし、あなたの例では、両方のクラスを相互にインスタンス化しています。これは絶対に違法です。

この背後にある理由を示すために、次のことを考えてください。

なしで1バイト、 。なしでClassA1バイトを取りましょう。さて、インクルード:今は2バイトかかります。今インクルード:今3バイトかかります。のサイズが大きくなったため、サイズを4バイトに更新する必要があります。そのロジックに続いて、5バイト、6バイト、7バイトになります......。bClassBabClassAaClassBClassAClassBClassBClassAClassB

これに対処するには、おそらく、(少なくとも)1つのタイプを、それぞれのクラスへのポインターまたは参照に変更する必要がaありbます。これを(c / c ++で)行うときは、メモリ管理を理解していることを確認してください。

元の問題の解決策は次のようになります。

ClassA.h

#pragma once
class ClassB;
class ClassA
{
public:
    ClassB* b;
}

ClassB.h

#pragma once
#include "ClassA.h"
class ClassB
{
public:
    ClassA a;
}

ClassB.hにはClassA.hが必要であることに注意してください。これは、デモンストレーションの目的ClassBで、タイプの完全なオブジェクトが含まれているClassAため、の定義ClassAが必要です。

于 2012-04-21T18:20:37.967 に答える