0

C ++プログラムの一部としてクラスを作成する際に問題が発生しています.FirstClass、SecondClass、ThirdClassの3つのクラスがあります.FirstClassとSecondClassの両方にThirdClass.hが含まれており、SecondClassでは正常に宣言できますが、 、FirstClassでは最初の宣言は正常に機能しますが、それ以降の宣言では「ThirdClassは型名ではありません」というエラーが表示されます

これは、エラーが発生しているクラスのスニペットです

#include "ThirdClass.h"

class FirstClass
{
public:

    FirstClass(void);

    // This decleration of ThirdClass works fine
    FirstClass(ThirdClass ());
    FirstClass(const FirstClass& rhs);
    ~FirstClass(void);

private:

    //These are the two that're erroring
    ThirdClass nestedClass();

    void Init (ThirdClass ());
    void Copy (FirstClass);
};

両方が同じヘッダーファイルにリンクしていることに関係していると思いますが、オンラインで解決策を見つけようとして広く探していましたが、役に立ちませんでした。インクルードを名前空間内に配置することでなんとか機能させることができましたが、これは非常に悪い習慣であると読んだので、実際にはそのようにしたくありません。

4

2 に答える 2

3
FirstClass(ThirdClass ());

これは何をすることになっていますか?

ThirdClassが宣言されている場合、関数のアドレスを引数として受け取るコンストラクターが宣言されますが、それはあなたが望んでいたことではありませんよね? ThirdClass ()引数を取らず、 を返す関数の型であるThirdClassため、コンストラクターの引数 (のアドレス) はその型の関数です。

ThirdClass が宣言されていない場合(そして、発生しているエラーは宣言されていないことを意味します)、次と同等です:

FirstClass ThirdClass();

つまり、オブジェクトThirdClassを返す(非コンストラクター) 関数が呼び出されます。FirstClass

おそらく、ThirdClassオブジェクトを引数として受け取るコンストラクターにしたいと考えていました。これは次のようになります。

FirstClass(ThirdClass);

または、引数のコピーを避けるには (通常はこれが必要です):

FirstClass(const ThirdClass&);

Initあなたの機能についても同様です。

ThirdClassis not a type name というエラーは、型が宣言されていないことを示しています。完全な自己完結型の例 (Cookie はありません) を示していないため、推測することしかできませんが、おそらく#include "FirstClass.h"ヘッダーThirdClass.hに含まれているため、循環参照が発生し、ファイルの 1 つだけが正しく処理されます。

詳細については、これらの質問 (およびその回答) を参照してください:
ヘッダー ファイル間の循環依存
関係 C++ 循環ヘッダー依存関係
C++ エラー: 'Line2' が宣言されていません

于 2012-12-31T16:04:23.987 に答える
2

私は、あなたのコンストラクターとInit()すべきだと思います

FirstClass(const ThirdClass &rhs);
...
void Init (const ThirdClass &rhs);

さらに、インクルード ガードの追加を検討する必要があります。

于 2012-12-31T15:30:19.403 に答える