動的確保と多態性

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
専門学生

動的確保と多態性

#1

投稿記事 by 専門学生 » 10年前

多態性を用いた動的確保をする際にエラーが出ており質問させていただきます。
ゲーム制作でステージを作っています。
ステージは数種類あり、ステージデータは外部データ(テキスト)から読み込みを行います。
(読み込み用クラスが有り、読み込んだ情報を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);
};
FloorNormal.h cpp

コード:

#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;
}
ObjectMgr.h ObjectMgr.cpp

コード:

#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;
}

アバター
HolyWings
記事: 12
登録日時: 14年前

Re: 動的確保と多態性

#2

投稿記事 by HolyWings » 10年前

クラス ObjMgr 内のメンバ変数 m_Floor は ObjectBaseのポインターとして宣言されていますが、
m_Floorを配列的に利用し、各要素にObjectBaseのポインターを代入しようとしているので
m_FloorはObjectBaseのポインターのポインターとして宣言し利用するべきだと思います。

専門学生

Re: 動的確保と多態性

#3

投稿記事 by 専門学生 » 10年前

HolyWings 様

ご指摘頂いた点を修正したところ
エラーなくコンパイルもとおり、実行結果にも問題ありませんでした。
とても助かりました。
ありがとうございました。

専門学生

Re: 動的確保と多態性

#4

投稿記事 by 専門学生 » 10年前

解決を忘れていました。

閉鎖

“C言語何でも質問掲示板” へ戻る