2011-02-22 10 views
1

Xcodeで自分のクラスの前方宣言を使用しようとしました。Xcodeでクラスの前方宣言を使用するときにエラーが発生する

は、ここに私の基本的なアーキテクチャです:

MyClassA.h:

class MyClassA{ 
    ... list of members and method prototypes ... 
}; 

MyClassA.cpp:

#include "MyClassA.h" 

--- list of methods for MyClassA ... 

MyClassB.h:

class MyClassA; // forward declaration 

class MyClassB{ 
    ... list of members and methods ... 
    MyClassA* ptrToA; 
}; 

MyClassB.cpp:

#include "MyClassB.h" 

... list of methods for MyClassB ... 

これは、Visual StudioのWindowsマシンで問題なく動作します。常に実行します。しかし、XcodeのMacでは、それは私にエラーを与えている:

Forward declaration of 'struct MyClassA' 

アイデア?エラーメッセージはあまり意味がないようですが、私はクラスとして明示的に宣言しています。構造体についてのエラーが返ってきます。前方宣言はXcodeではサポートされていません(かなりシンプルなエラーメッセージは、これがstruct/classの混乱以外の問題であると思われます)?私のプロジェクトはCではなくC++としてコンパイルされています。これを引き起こしている別のプロジェクト設定がありますか?

ありがとうございました。

+1

私はあなたが完全に見積もることができる例にそれをトリミングしようとすることをお勧めします。それで、人々は、例えばMyClassAの宣言の最後にセミコロンを本当に中断したかどうかを疑問に思う必要はありません。 – JWWalker

答えて

1

ptrToAを参照しない場合や、基になるタイプについて何かを知る必要がある場合を除き、#include "MyClassA.h" がMyClassB.cppに含まれていることを確認してください。

+0

私のせいです。とにかくありがとう。私は単に前方宣言がどのように機能するか誤解しました。私はMyClassB.hにMyClassA.hを含める代わりにForward宣言を使用しようとしていましたが、結局それが必要なものを得ることを望んでいました(Objective-Cは私が見つけたものからこのように動作します)。 私がMyClassA.hをインクルードすると、前方宣言を書く必要はありません。完全宣言は既に存在し、インクルードから利用可能です。 – DiggyJohn

+0

@TheoJohnあなたは私たちにすべての関連コードを表示していませんでした。それはあなたが記述しているかなり一般的なテクニックです。コンパイル時間を改善するのに非常に役立ちます。 – wilhelmtell

+0

私は実際のクラス名と他の無関係なメンバーとメソッド(float、chars、コンストラクタの束)を置き換えましたが、上の私の例のコードに書いたものは**関連する**コードの100%です。 – DiggyJohn

0

実際にエラーの原因となったコード行はありますか? MyClassA.c.hにMyClassA.hを含めることを忘れてしまったことが私の予想であり、オブジェクトをnewしようとすると実際にエラーが発生しています。

クラスは構造体です。彼らは構造体がそれらを公開している間、デフォルトでメンバーを非公開にするだけです。

+0

実際のフォワード宣言自体に誤りがあります。私はオブジェクトをまだ「新しい」コードに書いていません。 – DiggyJohn

+0

フォワード宣言がどのように機能するかを単に誤解したようです。私はそれらを以前はたくさん使っていましたが、私が思い出したフェスティバルではありませんでした(古いコードを振り返ります)。ClassAとClassBが同じヘッダーに一緒に存在し、お互いを参照していたため、私が使用した場所はすべて、前方宣言が必要でした。 私がしようとしている現在のケースでは、ClassB.hにClassA.hを含める必要があります...しかし、そうすることで、クラスの完全な宣言が完全に無意味なので、すでに存在しています。 – DiggyJohn

+0

いいえ、私はあなたが全く誤解しているとは思わない。 ClassAへのポインタが必要なだけであれば、前方宣言だけで十分です。しかし、オブジェクトの割り当てやメンバ関数の呼び出しのように、それを使い始めるとすぐに完全な宣言が必要です。これがClassB.cppで行うことであれば、そこにClassA.hを含める必要があります。 –

関連する問題