0

これは非常に基本的なC++の質問かもしれませんが、私は少し錆びています。ポイントを使って迷路型のデータ構造を設定しようとしています。これが私のコードです。

class Point{

    public :

    int xCoord;
    int yCoord;
    bool visited;

    //constructors
    Point(){}
    Point(int x, int y){
        xCoord = x;
        yCoord = y;
        visited = false;
    }
    int makeVisited(){
        visited = true;
    }

    int makeUnvisited(){
        visited = false;
    }
};



class Maze{

    public :

    int width;
    int height;
    Point ** grid; 

    //constructors
    Maze(){}
    Maze(int X, int Y){
        width = X;
        height = Y;
        grid = new Point*[width];
        for(int i = 0; i < width; i++){
            grid[i] = new Point[height];
            for(int j = 0; j < height; j++){
                grid[i][j] = new Point(i, j);
            }
        }
    }
}; //end of Maze class

grid [i] [j]に新しいポイントインスタンスを割り当てようとすると、次のようなエラーが発生します。

"エラーなし演算子"="これらのオペランドに一致します"

ポイントオブジェクトの初期化で何が悪かったのか誰かに教えてもらえますか?

4

4 に答える 4

1

gridとして宣言されているのでPoint**grid[i][j]はタイプPointです。したがって、これにを割り当てることはできませんnew Point


できることの1つは、次のようなセッターメンバー関数を定義することです。

void Point::set(int x, int y) {
  xCoord = x;
  yCoord = y;
}

そして、ループで次を使用できます。

grid[i][j].set(i, j);
于 2012-11-06T19:49:28.997 に答える
1

forループは次のようになります。

for(int i = 0; i < width; i++){
    grid[i] = new Point[height];
    for(int j = 0; j < height; j++){
        grid[i][j] = Point(i, j);
    }
}

配列には値ごとにすべてのポイントが含まれ、それらへのポインターは含まれていません。それがあなたの側の正しいデザインの選択だと思います。しかし、それはあなたがそこにポインタを入れようとしないことを意味します。のタイプgrid[i][j]Point、ではありませんPoint *new演算子はPoint、ヒープ上のオブジェクトにスペースを割り当て、それを指すポイントを返しますPoint *Pointしかし、あなたはすでにあなたの配列に完全に素晴らしいオブジェクトを持っています。

あなたのコードはあなたがJavaに慣れているように見えます。C ++では、値への参照を常に持つのではなく、実際に直接値を含めることができます。すべてのポイントは、実際には、を読み取る行のデフォルトのコンストラクターを使用して初期化されますgrid[i] = new Point[height];。そこでheight Pointオブジェクトを作成し、それらを初期化するためにそれぞれのデフォルトコンストラクターが呼び出されます。

私のコードを使用する場合は、後で一時Pointオブジェクトから値を再割り当てします。このオブジェクトの作成は、コンパイラによって存在しないように最適化され、およびから直接存在する既存の値の新しい値xCoordと値を割り当てるだけになります。yCoordPointij

于 2012-11-06T19:54:33.243 に答える
0

うーん、Point *** gridが必要です。もちろん、ポインタを格納する2つのdim配列が必要です。

于 2012-11-06T19:48:58.140 に答える
0

コンパイラは、クラスの代入演算子がないことを指摘しています。やろうとしていることを実現するには、「operator=」メソッドを定義する必要があります。この場合、ベクトルを使用することもお勧めします。

于 2012-11-06T19:54:17.287 に答える