C++ 流氓游戏初始化错误

C++ 流氓游戏初始化错误,c++,polymorphism,instance,dynamic-memory-allocation,roguelike,C++,Polymorphism,Instance,Dynamic Memory Allocation,Roguelike,我正在为简单的类似盗贼的游戏制作一张简单的地图。 因此,我需要通过接收来自字符数组[I][j]的数据,使用为每个数组单元创建的对象初始化映射。 建议在其他文件(如CWall.cpp、CWall.h)中定义此类CWall、CDoor类,下面是要在map.cpp中初始化的代码 但这是编码的正确方式吗? 我认为这会导致内存分配问题 CObject CMap::insertObject(char character){ if (character = '*') { CWall

我正在为简单的类似盗贼的游戏制作一张简单的地图。 因此,我需要通过接收来自字符数组[I][j]的数据,使用为每个数组单元创建的对象初始化映射。 建议在其他文件(如CWall.cpp、CWall.h)中定义此类CWall、CDoor类,下面是要在map.cpp中初始化的代码

但这是编码的正确方式吗? 我认为这会导致内存分配问题

CObject CMap::insertObject(char character){ 
    if (character = '*') {
        CWall cwall;
        return cwall;
    }

    if (character = 'D') {
        CDoor cdoor;
        return cdoor;
    }

    if (character = 'F') {
        CFood cfood;
        return cfood;
    }

    if (character = 'K') {
        CKey ckey;
        return ckey;
    }

    if (character = 'M') {
        CMMonster cmmonster;
        return cmmonster;
    }

    if (character = 'm') {
        CMonster cmonster;
        return cmonster;
    }

    if (character = '@') {
        CPlayer cplayer;
        return cplayer;
    }

    if (character = 'P') {
        CPrincess cprincess;
        return cprincess;
    }

    if (character = '&') {
        CRock crock;
        return crock;
    }

    if (character = 'S') {
        CShield cshield
        return cshield;
    }

    else {
        CShield cshield;
        return cshield;
    }
}

void CMap::initialize(char arr[][COLS]){
    for (int i = 0; i <= 11; i++){
        for (int j = 0; j <= 38; j++){
            char character = arr[i][j];
            insertObject(character);
        }
    }
}
CObject CMap::insertObject(字符){
如果(字符=“*”){
CWall-CWall;
返回cwall;
}
如果(字符='D'){
CDoor CDoor;
返回cdoor;
}
如果(字符='F'){
CFood CFood;
退货;
}
if(字符='K'){
奇奇奇;
返回ckey;
}
if(字符='M'){
CMMonster-CMMonster;
返回cmmonster;
}
if(字符='m'){
康斯特康斯特;
返回cmonster;
}
如果(字符=“@”){
cLayer cLayer;
返回cplayer;
}
if(字符='P'){
心肺复苏术;
退货;
}
如果(字符='&'){
瓦罐;
回流罐;
}
如果(字符='S'){
CShield CShield
返回cshield;
}
否则{
CShield CShield;
返回cshield;
}
}
void CMap::初始化(字符arr[][COLS]){

对于(int i=0;i这不是正确的方法。你要服从,因为我猜你的
CObject
是一个对象,而不是指向某个对象的指针。你需要在函数中返回
CObject*
类型的指针,然后针对每种情况返回
new CMonster
new CPlayer
等。甚至更好呃,改用智能指针


您试图实现的称为工厂方法模式,有关更多详细信息,请参见。这不是正确的实现方法。您必须遵守,因为我猜您的
CObject
是一个对象,而不是指向某个对象的指针。您需要在函数中返回
CObject*
类型的指针,然后r每个案例都返回一个
new CMonster
new CPlayer
等。更好的是,使用智能指针


您试图实现的是一种称为工厂方法模式的模式,有关更多详细信息,请参见。

首先,您实际上没有初始化任何东西。
CWall*CWall=new CWall;
将是动态分配和初始化新CWall对象的正确方法(当然,假设CWall有一个默认构造函数),或任何与此相关的对象

您还需要记住的是,对于使用
new
分配的所有内容,您必须稍后取消分配
delete
。因此,您需要考虑如何存储这些分配的对象,以便确保在完成后,析构函数或清理函数将删除所有对象。一种设计模式是考虑一下,尽管有好几十种好的方法来做。这是你必须自己做的步法,因为只有你对你的项目有足够的了解才能选择正确的设计模式。(我链接的那本书是一个伟大的资源。) 编辑:根据您的评论,还有一个问题,那就是您返回不同类型的对象。这是一个简单的继承问题,只要所有这些对象都继承自抽象基类
CObject
(或类似的东西),您可以简单地将返回类型列为
CObject*
。然后,只要您返回从
CObject
继承的对象(或指向对象的指针),您就是金色的


编辑2:无论何时使用
new
,实际上都会得到一个指向动态分配对象的指针。这本身就产生了一些问题,包括
new
可能会在分配失败时返回空指针。请务必检查这一点!智能指针可以防止许多此类问题,但您使用智能指针取决于您的设计模式选择。

首先,您实际上没有初始化任何东西。
CWall*CWall=new CWall;
将是动态分配和初始化新CWall对象(当然,假设CWall有默认构造函数)或任何对象的正确方法

您还需要记住的是,对于使用
new
分配的所有内容,您必须稍后取消分配
delete
。因此,您需要考虑如何存储这些分配的对象,以便确保在完成后,析构函数或清理函数将删除所有对象。一种设计模式是考虑一下,尽管有好几十种好的方法来做。这是你必须自己做的步法,因为只有你对你的项目有足够的了解才能选择正确的设计模式。(我链接的那本书是一个伟大的资源。) 编辑:根据您的评论,还有一个问题,那就是您返回不同类型的对象。这是一个简单的继承问题,只要所有这些对象都继承自抽象基类
CObject
(或类似的东西),您可以简单地将返回类型列为
CObject*
。然后,只要您返回从
CObject
继承的对象(或指向对象的指针),您就是金色的


编辑2:无论何时使用
new
,实际上都会得到一个指向动态分配对象的指针。这本身就产生了一些问题,包括
new
可能会在分配失败时返回空指针。请务必检查这一点!智能指针可以防止许多此类问题,但您使用智能指针取决于您的设计模式选择。

您应该动态处理数据。您要做什么
CObject* CMap::insertObject(char character){ 
    if (character = '*') {
        return new CWall();
    }
...