抽象的な Entity クラスにメインの Game クラスへのポインタを格納したいと思います。
Entity.h
#include "Game.h"
class Entity
{
public:
Entity(Game* game);
~Entity(void);
virtual void Draw(float dt) = 0;
virtual void Update(float dt) = 0; // '= 0' means pure virtual function (like 'abstract' in C#)
protected:
Game* m_game; // Missing type specifier error C4430
};
エンティティ.cpp
#include "Entity.h"
Entity::Entity(Game* game)
{
m_game = game;
}
Entity::~Entity(void)
{
}
次に、派生クラスをインスタンス化し、Game クラス参照をコンストラクターに渡して、それが格納されている基本クラスに渡すことができるようにする必要があります。
境界.h
#include "Entity.h"
class Boundary : public Entity
{
public:
Boundary(Game* game);
~Boundary(void);
// Override pure virtual functions
void Draw(float dt);
void Update(float dt);
};
Boundary コンストラクターは、参照された Game クラスを使用して、それ自体をリストに追加できます。
#include "Boundary.h"
Boundary::Boundary(Game* game) : Entity(game)
{
// Add entity to the main entity list
game->m_entities->push_back(*this);
}
Boundary::~Boundary(void)
{
}
void Boundary::Draw(float dt)
{
// Call the base class as follows (C# equivalent: 'base.Draw(dt)')
//Entity::Draw(dt);
}
void Boundary::Update(float dt)
{
}
これにより、次の 3 種類の問題が発生します。
game->m_entities->push_back(*this);
エラー C2663: 'std::list<_Ty,_Ax>::push_back': 2 つのオーバーロードには、'this' ポインターの有効な変換がありません
Game* m_game;
Entity.hで
エラー C4430: 型指定子がありません - int と見なされます
list<Entity>* m_entities;
Game.h で
エラー C2065: 'エンティティ': 宣言されていない識別子
Entity(Game* game);
Entity.hで
エラー C2061: 構文エラー: 識別子 'ゲーム'
私が達成しようとしているものに相当するC#は次のとおりです。
public abstract class Entity
{
protected Game game;
public abstract void Draw(float dt);
public abstract void Update(float dt);
}
public class Boundary : Entity
{
public Boundary(Game game)
{
this.game = game;
game.Entities.Add(this);
}
public override void Draw(float dt)
{
}
public override void Update(float dt)
{
}
}
どこで間違ったのですか?
編集:
Game.h
#include "btBulletDynamicsCommon.h"
//#include "LinearMath\btQuaternion.h"
#include <list>
using namespace std; // Required for list
class Entity; // Forward declaration
class Game
{
public:
list<Entity>* m_entities;
Game(void);
~Game(void);
void init();
void draw(float dt);
void loadContent();
void update(float dt);
private:
class btDefaultCollisionConfiguration* m_collisionConfiguration;
class btCollisionDispatcher* m_dispatcher;
class btDiscreteDynamicsWorld* m_dynamicsWorld;
class btBroadphaseInterface* m_overlappingPairCache;
class btSequentialImpulseConstraintSolver* m_solver;
void exitPhysics();
void initPhysics();
};
編集2:
私が今残されている唯一の問題は、コンストラクターでゲームを参照しようとすることです:
Boundary::Boundary(Game *game)
: Entity(game) // Initialise base
{
// Add entity to the main entity list
game->m_entities->push_back(*this); // ERROR
}
基本クラスは同じ問題に苦しんでいます
Entity::Entity(Game* game)
: m_game(game) // Initialise members
{
m_game->m_entities->push_back(this); // ERROR here too
}