C ++ Потеря ссылки на указатель после завершения области - PullRequest
3 голосов
/ 06 мая 2011

Я получаю действительно странную ошибку, когда после выхода из области действия for я не могу получить доступ к тому, на что указывал мой указатель во время цикла, даже если массив, содержащий объекты, объявлен в заголовке класса.

Это базовый код:

Class CTile{ /*Code*/ };

Class CMap  
{  
    public:  
        CTile** tiles;  
        CMap();  
}

CMap::CMap()  
{  
    int lines = 10;
    int cols = 10;
    tiles = new CTile*[lines];  
    for(int i = 0 ; i (lower than) lines;++)  
    {  
        this->tiles[i] = new CTile[cols];  
    }  
    for(int curLine = 0; curLine (lower than) lines ; curLine++)  
        for(int curCol = 0; curCol (lower than) cols; curCol++)  
        {
            CTile me = this->tiles[curLine][curCol];
            me.setType(1);
            //do whatever I need, and inside the loop everything works.  
        }  
    int a = this->tiles[2][2].getType(); // a gets a really weird number 
    this->tiles[2][2].setType(10); // crashes the program

}

Кто-нибудь знает, что может быть не так?

Ответы [ 2 ]

4 голосов
/ 06 мая 2011
CTile  me = this->tiles[curLine][curCol];

Вот проблема. me является копией исходного объекта tiles[curLine][curCol], поэтому все, что вы делаете с me, не отражается в исходном объекте. Оригинальный объект остается неизменным, даже если вы делаете me.setType(1). Я уверен, что вы этого не хотели.

Итак, исправление: используйте ссылку как:

CTile & me = this->tiles[curLine][curCol];
  //  ^ note this
me.setType(1);

Или еще лучше, вы можете просто сделать это:

tiles[curLine][curCol].setType(1); //"this" is implicit!
4 голосов
/ 06 мая 2011
CTile me = this->tiles[curLine][curCol];

Это должно быть

CTile& me = this->tiles[curLine][curCol];
me.setType(1);

Почему? Потому что вы сделали копию CTile, вместо того, чтобы создавать ссылку на копию в 2-мерном массиве. Теперь вы можете обнаружить, что сбой переместился в оператор me.setType(1).

...