无效的指针*

时间:2016-05-17 14:01:28

标签: c++ class pointers void-pointers

我正在上课的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。我希望能和任何人一起解决我的问题,谢谢你。

2 个答案:

答案 0 :(得分:5)

您正在尝试将对象转换为指针,使用&amp; 运算符来获取有问题的指针。

ActionList[i] = (void*)&P[i];
ActionList[i] = (void*)&M[i];

答案 1 :(得分:4)

此处的一个问题是Character结构不是GenericPlayerAbstractMonster的父级。似乎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];
}