我正在上课上的rpg游戏
我用ActionList *创建了一个存储实例的结构调用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。希望任何人都能解决我的问题,谢谢。
最佳答案
这里的问题之一是Character
结构不是GenericPlayer
或AbstractMonster
的父级。看来Character::instance
成员应该指向玩家或怪物,这意味着您的代码应类似于
ActionList[i].type = 'p';
ActionList[i].alive = true;
ActionList[i].instance = &P[i];
这是假定播放器列表已由
Battle
构造函数的调用者初始化,那么您不应分配新的播放器数组,因此应删除P = new GenericPlayer[numP];
语句。应该注意的是,像您这样做的事情是,一个“通用指针”(
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];
}
关于c++ - 类指向无效的指针*,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37278356/