在不使用动态数组的情况下初始化数组时出现问题

Having issues with array initialization without using dynamic array

本文关键字:数组 初始化 问题 情况下 动态      更新时间:2023-10-16

大家好,我希望能得到一些关于这段我遇到问题的代码的帮助。很抱歉搞砸了,但我一直在一遍又一遍地重写这篇文章,寻找解决方案。所以这是一个交易,我试图在一个名为"mLevelDesign"的类中硬编码一个数组。因此,每当我需要更新"map"时,我可以将它传递给mMapBuffer。我的问题是,我觉得这对我自己来说要困难得多,但我已经尝试创建该数组的第三个实例,因此我在标头中从private中删除了mLevelDesign,并添加了mCopyLevel,然后在构造Map时将mLevelDesign传递到mCopyLevel中,然后在mLevelDesign的位置使用mCopyLevel。尽管我似乎已经失去了很多记忆和其他问题运行的方式。我只是想知道,是否有一些简单的方法可以对数组进行硬编码,同时仍将其列在头文件中,甚至更好地避免在内存中丢失它?截至目前,此代码引发错误:无法在赋值中将"brace enclosed initializer list"转换为"int"。

//Map.h
#ifndef MAP_H
#define MAP_H
class Map
{
public:
    Map();
    void update();
    void drawMap();
private:
    int  mLevelDesign[100];
    int* mMapBuffer;
    int  mMapX;
    int  mMapY;
    int  mPlayerX;
    int  mPlayerY;
    bool mBossDead;
    bool mEnemy1Dead;
    bool mEnemy2Dead;
    bool mTreasureLooted;
};
#endif // MAP_H

//Map.cpp
#include <iostream>
#include "Map.h"
using namespace std;
Map::Map()
{
    mMapX = 10;
    mMapY = 10;
    mPlayerX =  6;
    mPlayerY = 10;
    mLevelDesign[100] =
            /* 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,10 */
    /*1*/    { 0 , 0 , 0 , 0 , 1 ,'D', 1 , 0 , 0 , 0 ,
    /*2*/      0 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 0 , 0 ,
    /*3*/      1 , 2 , 2 , 2 , 1 , 0 , 1 , 2 , 1 , 0 ,
    /*4*/      1 ,'T','E', 0 , 0 , 0 , 0 ,'F', 1 , 0 ,
    /*5*/      1 ,'B','E', 0 , 0 , 0 , 0 ,'M', 1 , 0 ,
    /*6*/      1 , 2 , 2 , 2 , 1 , 0 , 1 , 2 , 1 , 0 ,
    /*7*/      0 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 0 , 0 ,
    /*8*/      0 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 0 , 0 ,
    /*9*/      0 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 0 , 0 ,
    /*10*/     0 , 0 , 0 , 0 , 1 ,'D', 1 , 0 , 0 , 0 };
    mBossDead       = false;
    mEnemy1Dead     = false;
    mEnemy2Dead     = false;
    mTreasureLooted = false;
}
void Map::update()
{
    //Re-draw buffer from map copy
    mMapBuffer = new int[0];
    int arraySize = mMapX * mMapY;
    for(int i = 0; i < arraySize; ++i)
    {
        mMapBuffer[i] = mLevelDesign[i];
    }
    //Convert player cooordinates to array standard and draw player to map.
    int playerConversion = ((mPlayerY - 1) * mMapY) + (mPlayerX - 1);
    mMapBuffer[playerConversion] = 'P';
    //Check for changes in map.
    if(mBossDead == true)
        mMapBuffer[41] = 0;
    if(mEnemy1Dead == true)
        mMapBuffer[32] = 0;
    if(mEnemy2Dead == true)
        mMapBuffer[42] = 0;
}
void Map::drawMap()
{
    int count =  0;
    for(int y = 0; y < mMapY; ++y)
    {
        for(int x  = 0; x < mMapX; ++x)
        {
            if(mMapBuffer[count] == 0)
                {cout << "  "; count ++;}
            else if(mMapBuffer[count] == 1)
                {cout << "| "; count ++;}
            else if(mMapBuffer[count] == 2)
                {cout << "= "; count ++;}
            else if(mMapBuffer[count] == 'X')
                {cout << "X "; count ++;}
            else if(mMapBuffer[count] == 'D')
                {cout << "D "; count ++;}
            else if(mMapBuffer[count] == 'T')
                {cout << "T "; count ++;}
            else if(mMapBuffer[count] == 'P')
                {cout << "@ "; count ++;}
            else if(mMapBuffer[count] == 'M')
                {cout << "$ "; count ++;}
            else if (mMapBuffer[count] == 'F')
                {cout << "F "; count ++;}
            else if (mMapBuffer[count] == 'Q')
                {cout << "Q "; count ++;}
            else if(mMapBuffer[count] == 'E')
                {cout << "E "; count ++;}
            else if(mMapBuffer[count] == 'B')
                {cout << "B "; count ++;}
            else
                {cout << "  "; count ++;}
        }
        cout << endl;
    }
}

你不能那样做。将初始化放在构造函数初始值设定项列表中,或者手动设置一个又一个字段,或者创建一个临时数组并将其std::copy为实际数组。

由于尺寸的原因,我推荐最后一种:

Map::Map()
{
    static const int tempLevel[100] = { ... };
    std::copy(tempLevel, tempLevel + 100, mLevelDesign);
    ...
}