我正在上课的RPG游戏 我用ActionList *创建了一个struct调用Character,用于存储实例。 GeneralPlayer是一个类,其中还有一堆其他玩家类继承它。 这是我的头文件:
class Battle
{
public:
struct Character
{
char type;//monster or player?
bool alive;
void*instance;//pointer to instance
};
Battle(GeneralPlayer*,AbstractMonster*,int,int,int);
Battle(GeneralPlayer*, AbstractMonster*, int, int);
private:
Character *ActionList;
};
我试图将GeneralPlayer *转换为void *。然而,似乎代码不像我想的那样工作。 P和M是这些玩家类的指针数组。
Battle::Battle(GeneralPlayer*P, AbstractMonster*M, int a, int b, int c)
{
a = numP;
b = numM;
c = turn_limit;
ActionList = new Character[numP + numM];
P = new GeneralPlayer[numP];
for (int i = 0; i < numP; i++)
{
ActionList[i] = static_cast<void*>(P[i]);
ActionList[i].type = 'p';
}
for (int i = numP; i < numP+numM; i++)
{
ActionList[i] = static_cast<void*>(M[i]);
ActionList[i].type = 'm';
}
}
它一直显示错误C2440。我希望能和任何人一起解决我的问题,谢谢你。
答案 0 :(得分:5)
您正在尝试将对象转换为指针,使用&amp; 运算符来获取有问题的指针。
ActionList[i] = (void*)&P[i];
ActionList[i] = (void*)&M[i];
答案 1 :(得分:4)
此处的一个问题是Character
结构不是GenericPlayer
或AbstractMonster
的父级。似乎Character::instance
成员应该指向玩家或怪物,这意味着你的代码应该像
ActionList[i].type = 'p';
ActionList[i].alive = true;
ActionList[i].instance = &P[i];
这假设播放器列表已由Battle
构造函数的调用者初始化,那么您不应该分配新的播放器数组,因此应删除P = new GenericPlayer[numP];
语句。 / p>
应该注意的是,像你这样的东西,一个“通用指针”(void *
是什么),然后一个成员说它真正指向的是什么类型被认为是糟糕的设计。相反,你会为怪物和玩家提供一个共同的基类,并使用指向它的指针。然后正确使用多态和virtual
成员函数,您不需要type
字段。然后很容易重构代码以使用其他方法来判断玩家或怪物是否还活着,然后根本不需要Battle::Character
类,并且可以使用指针数组而是公共基类,因此简化了代码,这对于可维护性非常有用。
在您显示代码时,还会出现一些其他问题,这些问题将在以后的运行时引发问题。
一个问题是,在迭代怪物的循环中,您将o
初始化为numP
并循环到numP + numM
,但如果数组M
没有包含numP + numM
元素,你将超出范围。
相反,我建议你这样做。
for (int i = 0; i < numM; i++)
{
ActionList[i + numP].type = 'm';
ActionList[i + numP].alive = true;
ActionList[i + numP].instance = &M[i];
}