2012-04-21 16 views
4

宣言を別のヘッダーのファイルに転送することはできますか?例えば:別のファイルの前方宣言C++

#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の両方がお互いに依存し、その両方は、他のタイプのオブジェクトを持っています。私がしたことは、両方のクラスが別のファイルで宣言されたことでした。これを行うためのきれいな方法がありますか?

+1

サイクルを中断する必要があります。あなたがAのインスタンスを作成しようとした場合に起こることを考えてみてください。(Aを作成し、Bを作成し、Aを作成する必要があり、Bを作成する必要があります...) – Mat

+0

それはカップリングです。ではない?なぜお互いの定義が必要なのですか?具体的な例?それらの機能が似ている場合、それらをサブクラスにすることはできますか? – CppLearner

+0

@CppLearner "なぜお互いの定義が必要ですか?"私の間違い – user52343

答えて

3

一般に、ヘッダーをまたいでクラスを前方宣言することは正当です。

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

は、この背後にある理由を表示するには、次を考える:

ClassAaなしbClassBも1バイトせずに1つのバイトを見てみましょう。 今、bを含める:ClassAは2バイトを要します。今すぐaを含める:ClassBは3バイトかかります。今度は、ClassBのサイズの増加のために、ClassAのサイズを4バイトに更新する必要があります。 aの一つとbそのロジックClassB、以下これに対処するには、今5バイト、ClassA 6バイト、ClassB 7バイト.......

である、あなたはおそらく(少なくとも)の種類を変更したいですそれぞれのクラスへのポインタまたは参照へのポインタです。これを行うとき(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の定義が必要です。

3

はい。しかし、ClassA a;の代わりにClassA* a;またはClassA& a;を使用してください(対応するcppファイルの初期化あり) ClassBのサイズを計算するためのサイズについての情報がありません。