2

Component と Transform のベクトルを持つクラス GameObject があります。Transform はコンポーネントですが、単独でアクセスできます。Component.h と Transform.h の両方を GameObject に含めようとすると、Component で Base class undefined エラーが発生します。

エラーメッセージ:

    Error   1   error C2504: 'Component' : base class undefined c:\users\pyro\documents\visual studio 2010\projects\engine\main\transform.h 9

GameObject.h

    #ifndef _GameObject
    #define _GameObject
    #include "Core.h"
    #include "Component.h"
    #include "Transform.h"

    class Transform;
    class Component;

    class GameObject
    {
        protected:
            Transform* transform;
            vector<Component*> components;
    };

    #endif

Component.h

    #ifndef _Component
    #define _Component

    #include "Core.h"
    #include "GameObject.h"

    class GameObject;

    class Component
    {
    protected:
        GameObject* container;
    };
    #endif

Transform.h

    #ifndef _Transform
    #define _Transform

    #include "Core.h"
    #include "Component.h"

    //Base class undefined happens here
    class Transform : public Component
    {
    };

    #endif

他にもたくさんのトピックを見つけましたが、それらは私が抱えている問題に実際には対処していません。質問は次のとおりです。なぜこのエラーが発生するのですか?どうすれば修正できますか?

4

2 に答える 2

9

コードにはいくつかの問題があります。


1.循環依存

GameObject.hを含むComponent.h、およびComponent.h含むGameObject.h

この循環依存はすべてを壊します。インクルージョンガードにより、「開始」するファイルに応じて、GameObject表示されないか、Componentまたはその逆になります。

循環依存関係を削除します。すでに前方宣言を使用しているため、これらの s はまったく必要ありません。#include一般に、#includein ヘッダーの使用は最小限に抑えます。


2.構文エラー

それを修正したら、不足している inを追加し};Component.hます。

(あなたの定義は、その時点では完全に定義されていないTransformネストされたクラスであると考えています。)Component


3.予約名

_これは今日では実際的な問題にはならないかもしれませんが、マクロ名は実装 (コンパイラ) 用に予約されているため、 で始まるべきではありません。

于 2013-01-05T22:47:10.893 に答える