2013-12-04 2 views
0

Привет всем Я надеялся, что смогу получить некоторую помощь в этом фрагменте кода, с которым у меня возникли проблемы. Извините за беспорядок, но я снова и снова переписывал эту часть, ища решения. Итак, вот сделка, я пытаюсь жестко закодировать массив внутри класса a.k.a «mLevelDesign». Поэтому я могу передать его mMapBuffer всякий раз, когда мне нужно обновить «карту». Моя проблема в том, что я чувствую, что мне это намного сложнее, чем нужно, но я уже пробовал создать третий экземпляр массива, чтобы я удалил mLevelDesign из частного в заголовке и добавил say mCopyLevel, а затем передал mLevelDesign в mCopyLevel, когда Карта построена, затем используйте mCopyLevel в месте mLevelDesign. Хотя я, похоже, получил много потерянной памяти и другие проблемы, которые запускаются именно так. Мне просто интересно, есть ли какой-нибудь простой способ, чтобы иметь возможность жестко закодировать массив, сохраняя при этом его содержимое в заголовочном файле и даже еще лучше не потерять его в памяти? На данный момент этот код вызывает ошибку: не может преобразовать «список инициализаторов, заключенных в скобки» в «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; 
    } 
} 

ответ

1

Вы не можете этого сделать. Либо поместите инициализацию в список инициализатора конструктора, либо вручную установите поле после поля, либо создайте временный массив, а std::copy - в фактический массив.

Из-за размера, я бы рекомендовал последний:

Map::Map() 
{ 
    static const int tempLevel[100] = { ... }; 

    std::copy(tempLevel, tempLevel + 100, mLevelDesign); 

    ... 
} 
+0

То есть это работает до сих пор, спасибо. Я полагаю, что раньше, по моей предыдущей попытке, у меня была одна копия, которую все остальные пытались извлечь из нее, но ее сбрасывали, и все искало ее в той области, которой она больше не была. – user3065238

Смежные вопросы