1. ホーム
  2. c++

[解決済み】ベースクラスが未定義

2022-02-10 17:27:56

質問

以下のコードでエラーが発生します。

'WorldObject'です。[ベースクラスは未定義(ドイツ語から翻訳)] 。

これはなぜでしょうか?以下は、このエラーを発生させるコードです。

ProjectilObject.h:

#pragma once

#ifndef _PROJECTILOBJECT_H_
#define _PROJECTILOBJECT_H_

#include "GameObjects.h"
class WorldObject;
class ProjectilObject: public WorldObject
{
public:
    ProjectilObject(IGameObject* parent,int projectiltype);

    void deleteyourself();
protected:
virtual void VProcEvent( long hashvalue,    std::stringstream &stream);
    virtual void VInit();
    virtual void VInitfromStream( std::stringstream &stream     );
    virtual void VonUpdate();
    virtual void VonRender();
private:
    vec3 vel;

    float lifetime;
    float lifetimeend;

    vec3 target;

    int m_projectiltype;
};

#endif

以下は、WorldObject クラスのコードファイルです。

GameObjects.h。

#pragma once

#ifndef _GAMEONJECTCODE_H_
#define _GAMEONJECTCODE_H_

#include "IGameObject.h"
#include "Sprite.h"
#include "GamePath.h"
#include "HashedString/String.h"
#include "IAttribute.h"
#include "CharacterObjects.h"

...

class WorldObject: public IGameObject, public MRenderAble
{
public:
    WorldObject(IGameObject* parent);
    virtual bool IsDestroyAble();
    virtual bool IsMageAble();
    virtual bool IsRenderAble();
protected:
    virtual void VProcEvent( long hashvalue, std::stringstream &stream);
    virtual void VonUpdate();
    virtual void VonRender();
    virtual void VInit() =0;
    virtual void VInitfromStream( std::stringstream &stream ) =0;
    virtual void VSerialize( std::stringstream &stream );

    vec3 poscam;    
};

...

#endif

このファイルには他にもいくつかクラスがありますが、重要ではないはずです。もしかしたら、私が見落とした小さなエラーがあるかもしれませんが、なぜこのエラーが発生するのか理解できません。もっとコードが必要なときは、遠慮なく言ってください。

解決方法は?

を含むソースファイルがある場合 GameObjects.h 前に ProjectilObject.h を含まないか、または ProjectilObject.h を直接指定した場合、コンパイラはまずその宣言の中から ProjectilObject にインクルードすることで GameObjects.h を知る前に WorldObject があります。というのも GameObjects.h が最初に含まれます。 ProjectilObject.h を宣言し、次に WorldObject . その場合、インクルードされた GameObjects.h に存在する ProjectilObject.h は動作しません。 _GAMEONJECTCODE_H_ はすでに定義されています。

これを避けるには、必ず ProjectilObject.h の代わりに GameObjects.h を使用するか、または 前方宣言 .