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] 一个新的点实例时,我收到一条错误消息

"error no operator "=" 匹配这些操作数"

有人能告诉我我在初始化点对象时做错了什么吗?

4

4 回答 4

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 回答
1

由于grid被声明为 a Point**, thengrid[i][j]的类型为Point。所以你不能分配new Point给这个。


您可以做的一件事是定义一个 setter 成员函数,例如:

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

然后在你的循环中你可以使用:

grid[i][j].set(i, j);
于 2012-11-06T19:49:28.997 回答
0

嗯,您需要 Point ***grid,因为您显然希望有 2 个暗淡的数组存储指针。

于 2012-11-06T19:48:58.140 回答
0

编译器指出您没有该类的赋值运算符。您必须定义一个 'operator=' 方法来实现您想要做的事情。在这种情况下,您也最好使用向量。

于 2012-11-06T19:54:17.287 回答