動的確保と多態性
Posted: 2014年11月12日(水) 03:24
多態性を用いた動的確保をする際にエラーが出ており質問させていただきます。
ゲーム制作でステージを作っています。
ステージは数種類あり、ステージデータは外部データ(テキスト)から読み込みを行います。
(読み込み用クラスが有り、読み込んだ情報をObjectMgrのCreate関数に引数で渡します。)
ステージ毎にステージサイズが異なるため、動的確保を用いることにしました。
ObjectBaseを継承した、FloorNormal(未記載のFloorSound・FloorMeltもあります)が有り、
ObjectMgrのCreate関数で引数に応じた、種類と数のオブジェクトを生成しようとしています。
ObjectMgrのSwitch文内で引数のFloorの値によって、オブジェクトを生成しようとしたのですがcase毎にエラーが出てしまいました。(同内容でエラー3つ)
>objectmgr.cpp(34) : error C2679: 二項演算子 '=' : 型 'ObjectBase *' の右オペランドを扱う演算子が見つかりません (または変換できません)。
1> objectbase.h(43): 'ObjectBase &ObjectBase::operator =(const ObjectBase &)' の可能性があります。
1> 引数リスト '(ObjectBase, ObjectBase *)' を一致させようとしているとき
1>objectmgr.cpp(37) : error C2679: 二項演算子 '=' : 型 'ObjectBase *' の右オペランドを扱う演算子が見つかりません (または変換できません)。
1> objectbase.h(43): 'ObjectBase &ObjectBase::operator =(const ObjectBase &)' の可能性があります。
1> 引数リスト '(ObjectBase, ObjectBase *)' を一致させようとしているとき
1>objectmgr.cpp(40) : error C2679: 二項演算子 '=' : 型 'ObjectBase *' の右オペランドを扱う演算子が見つかりません (または変換できません)。
1> objectbase.h(43): 'ObjectBase &ObjectBase::operator =(const ObjectBase &)' の可能性があります。
1> 引数リスト '(ObjectBase, ObjectBase *)' を一致させようとしているとき
何が原因でしょうか?
コードが長くなるため、ある程度、省略したコードを張らせていただきます。
ObjectBase.h
FloorNormal.h cpp
ObjectMgr.h ObjectMgr.cpp
ゲーム制作でステージを作っています。
ステージは数種類あり、ステージデータは外部データ(テキスト)から読み込みを行います。
(読み込み用クラスが有り、読み込んだ情報をObjectMgrのCreate関数に引数で渡します。)
ステージ毎にステージサイズが異なるため、動的確保を用いることにしました。
ObjectBaseを継承した、FloorNormal(未記載のFloorSound・FloorMeltもあります)が有り、
ObjectMgrのCreate関数で引数に応じた、種類と数のオブジェクトを生成しようとしています。
ObjectMgrのSwitch文内で引数のFloorの値によって、オブジェクトを生成しようとしたのですがcase毎にエラーが出てしまいました。(同内容でエラー3つ)
>objectmgr.cpp(34) : error C2679: 二項演算子 '=' : 型 'ObjectBase *' の右オペランドを扱う演算子が見つかりません (または変換できません)。
1> objectbase.h(43): 'ObjectBase &ObjectBase::operator =(const ObjectBase &)' の可能性があります。
1> 引数リスト '(ObjectBase, ObjectBase *)' を一致させようとしているとき
1>objectmgr.cpp(37) : error C2679: 二項演算子 '=' : 型 'ObjectBase *' の右オペランドを扱う演算子が見つかりません (または変換できません)。
1> objectbase.h(43): 'ObjectBase &ObjectBase::operator =(const ObjectBase &)' の可能性があります。
1> 引数リスト '(ObjectBase, ObjectBase *)' を一致させようとしているとき
1>objectmgr.cpp(40) : error C2679: 二項演算子 '=' : 型 'ObjectBase *' の右オペランドを扱う演算子が見つかりません (または変換できません)。
1> objectbase.h(43): 'ObjectBase &ObjectBase::operator =(const ObjectBase &)' の可能性があります。
1> 引数リスト '(ObjectBase, ObjectBase *)' を一致させようとしているとき
何が原因でしょうか?
コードが長くなるため、ある程度、省略したコードを張らせていただきます。
ObjectBase.h
class ObjectBase
{
protected:
CMesh m_Mesh; // メッシュ
D3DXVECTOR3 m_Pos; // 位置
public:
ObjectBase(void);
virtual ~ObjectBase(void);
virtual bool Create(void);
virtual bool Initialize(void);
virtual bool Update(void);
virtual bool Render(void);
virtual bool Destroy(void);
virtual CMesh* GetMesh(void);
};
#include "ObjectBase.h"
class FloorNormal : public ObjectBase
{
public:
FloorNormal(void);
~FloorNormal(void);
bool Create(void)override;
bool Initialize(void)override;
bool Update(void)override;
bool Render(void)override;
bool Destroy(void)override;
};
#include "FloorNormal.h"
FloorNormal::FloorNormal(void)
{
}
FloorNormal::~FloorNormal(void)
{
}
bool FloorNormal::Create(void){
// Floor生成
m_Mesh.CreateBox(g_pD3Device,TIP_SIZE,TIP_SIZE / 4,TIP_SIZE);
m_Pos.y = m_Mesh.py - m_Mesh.GetHeight() / 2;
return true;
}
bool FloorNormal::Initialize(void){
return true;
}
bool FloorNormal::Update(void){
m_Mesh.SetPosition(m_Pos.x,m_Pos.y,m_Pos.z);
m_Mesh.Update();
return true;
}
bool FloorNormal::Render(void){
m_Mesh.Render();
return true;
}
bool FloorNormal::Destroy(void){
m_Mesh.Destroy();
return true;
}
#include "FloorNormal.h"
#include "FloorMelt.h"
#include "FloorSound.h"
class ObjectMgr
{
private:
int m_StageZ,m_StageX; // ステージサイズ(Z:縦 X:横)
ObjectBase *m_Floor; // 床 オブジェクト
public:
ObjectMgr(void);
~ObjectMgr(void);
bool Create(int *Floor,int StageZ,int StageX);
};
bool ObjectMgr::Create(int *Floor,int StageZ,int StageX){
// ステージサイズを取得
m_StageZ = StageZ;
m_StageX = StageX;
// Floor 配列 動的確保
m_Floor = new ObjectBase[m_StageZ * m_StageX];
for(int i=0;i<m_StageZ;i++){
for(int j=0;j<m_StageX;j++){
// Floorタイプによって生成するオブジェクトを判定
switch(Floor[j+(m_StageX*i)]){
case NORMAL_FLOOR:
m_Floor[j+(m_StageX*i)] = (ObjectBase *)new FloorNormal();
break;
case MELT_FLOOR:
m_Floor[j+(m_StageX*i)] = (ObjectBase *)new FloorMelt();
break;
case SOUND_FLOOR:
m_Floor[j+(m_StageX*i)] = (ObjectBase *)new FloorSound();
break;
}
}
}
return true;
}