web-dev-qa-db-ja.com

エラーC2504:未定義の基本クラス

私は以前に何度もこのエラーに遭遇し、最終的に解決策を見つけましたが、これは困惑しました。 「Player」クラスから継承された「Mob」クラスがあります。これはMob.hです。

#pragma once
#include "PlayState.h"
#include "OmiGame/OmiGame.h"
#include "resources.h"

class PlayState;

class Mob
{
private:
    int frames;
    int width;
    int height;
    int time;

    sf::Texture textureL;
    sf::Texture textureR;
    Animation animationL;
    Animation animationR;
    AnimatedSprite Sprite;
    bool moveLeft;
    bool moveRight;
    bool facingRight;

public:
    void createMob(std::string l, std::string r, int frames, int width, int height, int time, int x, int y);

    void updateMob(omi::Game *game, PlayState *state);
    void drawMob(sf::RenderTarget &target);

    void setLeft(bool b) { moveLeft = b; }
    void setRight(bool b) { moveRight = b; }
    bool isLeft() { return moveLeft; }
    bool isRight() { return moveRight; }

    sf::Vector2f getPosition() { return Sprite.getPosition(); }
};

これはPlayer.hです。現時点では、非常にシンプルです。

#pragma once
#include "OmiGame/OmiGame.h"
#include "PlayState.h"
#include "Mob.h"
#include "resources.h"

class PlayState;
class Mob;

const int playerFrames = 8;
const int playerWidth = 16;
const int playerHeight = 48;
const int playerTime = 50;
const int playerX = 200;
const int playerY = 200;

class Player : public Mob
{ //the error occurs at this line//
public:
    Player();
    void update(omi::Game *game, PlayState *state);
    void draw(sf::RenderTarget &target);
};

そして、ご想像のとおり、これはエラーです。

error C2504: 'Mob' : base class undefined   player.h

私はmobを前向きに宣言しました。うまくいけば、循環依存関係を修正できました。誰かが私を助けてくれませんか?

8
Greg Treleaven

コンパイラーは継承のために完全な定義を必要とするため、前方宣言はclass Player : public Mobには役立ちません。

したがって、Mob.hのインクルードの1つがPlayer.hを取り込むことで、PlayerがMobよりも優先され、エラーが発生します。

24
TheUndeadFish

私は同様の問題を解決し、解決策を見つけ、それを私にとっての経験則にした

ソリューション/経験則

//File - Foo.h
#include "Child.h"
class Foo 
{
//Do nothing 
};

//File - Parent.h
#include "Child.h" // wrong
#include "Foo.h"   // wrong because this indirectly 
                   //contain "Child.h" (That is what is your condition)
class Parent 
{
//Do nothing 
Child ChildObj ;   //one piece of advice try avoiding the object of child in parent 
                   //and if you want to do then there are diff way to achieve it   
};

//File - Child.h
#include "Parent.h"
class Child::public Parent 
{
//Do nothing 
};

子を親クラスに含めないでください。

親クラスに子オブジェクトを持つ方法を知りたい場合は、リンクを参照してください Alternative

ありがとうございました

9
hemant c

これがその問題に対処する最良の方法ではないことは知っていますが、少なくとも私にとってはうまくいきます。他のすべてのインクルードをcppファイルに入れることができます。

#include "OmiGame/OmiGame.h"
#include "PlayState.h"
#include "Mob.h"
#include "resources.h"
1
Mark green