class 指向 void* 的指针
Pointer of class to void*
我正在和 class 一起开发角色扮演游戏
我用存储实例的 ActionList* 创建了一个结构调用字符。
GeneralPlayer 是一个 class,但仍有许多其他玩家 class 继承了它。
这是我的头文件:
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 是那些玩家的指针数组 classes.
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。我希望可以解决我的问题,任何人都可以帮助谢谢。
您正在尝试将对象转换为指针,请使用 & 运算符获取相关指针。
ActionList[i] = (void*)&P[i];
ActionList[i] = (void*)&M[i];
这里的一个问题是 Character
结构不是 GenericPlayer
或 AbstractMonster
的父结构。似乎 Character::instance
成员应该指向玩家或怪物,这意味着您的代码应该类似于
ActionList[i].type = 'p';
ActionList[i].alive = true;
ActionList[i].instance = &P[i];
这是假设玩家列表已经被 Battle
构造函数的调用者初始化,那么你不应该分配一个新的玩家数组,所以应该删除 P = new GenericPlayer[numP];
语句.
应该注意的是,像你这样的东西,一个 "generic pointer"(void *
是什么)然后一个成员说出它真正指向的类型被认为是糟糕的设计。相反,您将为怪物和玩家提供一个共同的基础-class,并使用指向它的指针。然后通过正确使用 polymorphism 和 virtual
成员函数,您不需要 type
字段。然后很容易重构代码以使用其他一些方法来判断玩家或怪物是否还活着,然后你根本不需要 Battle::Character
class,并且可以使用而是指向公共基础的指针数组class,从而简化了代码,这对于可维护性非常好。
您展示的代码还有一些其他问题,这些问题会在稍后的运行时引起问题。
一个问题是在遍历怪物的循环中,你将 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];
}
我正在和 class 一起开发角色扮演游戏 我用存储实例的 ActionList* 创建了一个结构调用字符。 GeneralPlayer 是一个 class,但仍有许多其他玩家 class 继承了它。 这是我的头文件:
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 是那些玩家的指针数组 classes.
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。我希望可以解决我的问题,任何人都可以帮助谢谢。
您正在尝试将对象转换为指针,请使用 & 运算符获取相关指针。
ActionList[i] = (void*)&P[i];
ActionList[i] = (void*)&M[i];
这里的一个问题是 Character
结构不是 GenericPlayer
或 AbstractMonster
的父结构。似乎 Character::instance
成员应该指向玩家或怪物,这意味着您的代码应该类似于
ActionList[i].type = 'p';
ActionList[i].alive = true;
ActionList[i].instance = &P[i];
这是假设玩家列表已经被 Battle
构造函数的调用者初始化,那么你不应该分配一个新的玩家数组,所以应该删除 P = new GenericPlayer[numP];
语句.
应该注意的是,像你这样的东西,一个 "generic pointer"(void *
是什么)然后一个成员说出它真正指向的类型被认为是糟糕的设计。相反,您将为怪物和玩家提供一个共同的基础-class,并使用指向它的指针。然后通过正确使用 polymorphism 和 virtual
成员函数,您不需要 type
字段。然后很容易重构代码以使用其他一些方法来判断玩家或怪物是否还活着,然后你根本不需要 Battle::Character
class,并且可以使用而是指向公共基础的指针数组class,从而简化了代码,这对于可维护性非常好。
您展示的代码还有一些其他问题,这些问题会在稍后的运行时引起问题。
一个问题是在遍历怪物的循环中,你将 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];
}