2016-11-01 7 views
4

たとえば、クラスAにはクラスBのメンバーがあります。一般に、コンパイルの依存関係を最小限に抑えるために、クラスAにはBのポインタを組み込み、クラスAの宣言のB。次のようになります。C++でtypedefクラスをあらかじめ宣言する方法

//B.h 
class B 
{ 
    .... 
}; 

//A.h 
class B; 
class A 
{ 
    B*b; 
    A(); 
    ... 
}; 

//A.cpp 
#include "B.h" 
A::A() 
{ 
    b=new B(); 
    ... 
}; 

しかし、今、私は疑問を持っている:Bのクラスは、次のようにのtypedef を使用して定義されている場合:

typedef class 
{ 
.... 
}B; 

前の事前宣言されたメソッドは、この中には動作しません。場合。 A.hでクラスBを事前に宣言する必要がありますか?

+0

'typedef class B foo;'そしてあなたのクラスを普通に宣言しただけです。そのようなクラスをtypedefするためのポイントは何ですか?あなたのクラスはtypedefを必要としません。ところで、あなたが円を持っていない場合は、AヘッダーにBヘッダーを含めてください。 – Stargateur

+0

@Stargateur 'class B'と' B'はこのケースでは異なります –

+2

私は他の人がwritedクラスを使うかもしれないので、私はこの質問をします。彼らはtypedefを使ってクラスを宣言します。私は元のファイルを変更したくありません。だから私はこの問題を解決する方法があるかどうかを知りたい。 – KevinZhu

答えて

2

コードtypedef class { .... } B;では、名前なしクラスであり、Bは名前のないクラスのタイプエイリアスです。

名前のないクラスを定義せずに宣言することはできません(つまり、クラス本体を提供する)。また、Bが名前のないクラスのtypedefであると宣言することはできません。

typedefの前方宣言などはありません。一般に、typedefは後で完了する不完全型のエイリアスを宣言することができますが、名前のないクラスはそれらのいずれの役割も満たすことができません。

注有権者からのフィードバックに応じて

削除し、さらにアドバイス:質問は用語「事前宣言」を使用。 C++標準では、「事前宣言」またはより一般的な用語「前方宣言」を使用していません。標準の用語では、クラスの前方宣言は単にクラス宣言と呼ばれます。すでに文脈から明らかでない場合は、「定義ではない宣言」と言って明らかにすることができます。

+2

OPは既にこれを行っています、最後のステートメントをコメントとして投稿することもできます。 –

+0

なぜこれがダウン表示されているのか分かりません。最初の文はOPの質問に答え、残りの部分はOPの問題を解決する別の方法を提供します。 @barakmanos答えには追加のアドバイスがないというルールはありません。 IMOは単に「あなたはできない」と言っています。それほど役に立たない答えです。 –

+0

私はあなたの答えをダウン投票しませんでした(これは簡単で簡単です)。私はそれがコメントとしてより適切かもしれないと示唆しただけです。私の推測では、ここのコミュニティは多量のニット・ピッカーで構成されているため、ダウン投票されたということです。 –

関連する問題