我正在上课上的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结构不是GenericPlayerAbstractMonster的父级。看来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/

10-13 08:19