我正在尝试制作一个包含游戏中所有怪物的数据结构。由于某种原因,当我分配新怪物时,我在初始化中得到"无法将怪物**转换为p_monster{Aka怪物*}"。如果你能帮助我,将不胜感激。提前致谢
struct Monster {
int x;
int y;
int health;
Monster *next;
};
typedef Monster* p_monster;
class gameUtils {
protected:
p_monster monster};
public:
gameUtils(){
monster=NULL;
...}
function(){
monster = getMonster(monster)} // so that I can assign whatever value I want to monster->last->next through the function itself
p_monster getMonster(p_monster monster){
p_monster newMonster = new p_monster;
if(monster==NULL){
monster=newMonster;
}else{
.... // find last monster then create new one and pass it to caller
return monster; // returns new monster without any value
}
类型别名在using
中稍微清晰一些。
//typedef Monster* p_monster;
using p_monster = Monster*;
p_monster
Monster*
.现在,当您调用new T
时,将创建一个类型为T
的对象,结果您将获得指向该对象的指针,即T*
.
当你写:
p_monster newMonster = new p_monster;
然后new
动态分配一个p_monster
,一个Monster*
,你会得到一个p_monster*
,一个Monster**
。没有从Monster**
到Monster*
的转换,因此错误。
我建议std::vector<Monster>
来存放你的怪物。你的列表方法是侵入性的,你设计中的Monster
知道自己在链表中,它有一个next
成员。使用std::vector<Monster>
时,您可以将Monster
存储在载体中、载体外部或其他容器中,Monster
无需注意。 此外,不通过原始指针使用手动内存管理将使代码更简单。
struct Monster {
int x;
int y;
int health;
Monster(int x,int y,int health) : x(x),y(y),health(health) {}
};
struct gameUtils {
std::vector<Monster> monster;
Monster& createMonster(int x,int y,int health) {
monster.emplace_back(x,y,health);
return monster.back();
}
};
C++中的链表是std::list
的,尽管向量从其元素存储在连续内存中获利很多。它从中受益匪浅,以至于它通常优于std::list
,即使某些方法的时间复杂度表明并非如此。