3

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

}

誰が何が間違っているのか知っていますか?

4

2 に答える 2

4
CTile me = this->tiles[curLine][curCol];

そうあるべき

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

なんで?2 次元配列内のものへの参照を作成する代わりに、CTile のコピーを作成したためです。クラッシュがme.setType(1)ステートメントに移動したことに気付くかもしれません。

于 2011-05-06T16:22:43.710 に答える
4
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!
于 2011-05-06T16:23:26.857 に答える