0

我想创建一个类,它有几个指向这个类的其他实例的指针。我想创建可以设置相邻单元格的生活游戏。

我遇到的问题是我无法为我的 const 指针成员变量分配引用。

class Cell {

            ...
        const Cell* left;
            ...

        void setLeft(const Cell & left) {
        this->left = left;
    }
}

我有想法将所有单元格保存在这样的向量中

std::vector<Cell::Cell> cells;

然后像这样访问和设置它们cells[pos].setLeft(cells[left]);(pos和left是整数)

我收到以下错误消息。Can't convert const cell to const cell* in assignment. 也找不到方法setLeft

我来自 java/net 背景,所以也许我犯了一个巨大的错误。

4

3 回答 3

2

您正在混淆指针和引用(当您来自 java/net 时,这是可以理解的)。在 C++ 中,有明显的区别:

  1. Cell x;, 类的对象(实例)Cell
  2. Cell *x;, 指向一个实例的指针Cell
  3. Cell &x;, 对一个实例的引用(“另一个名字”)Cell

Java“引用”等同于 C++ 指针。

在你的情况下,有几个问题。首先,setLeft()需要获取其参数的地址,如下所示:

void setLeft(const Cell & left) {
  this->left = &left;
}

其次,除非类Cell是在命名空间中定义的,否则Cell向量只能是std::vector<Cell> cells;.

然而,更危险的是你的向量包含静态分配Cell的对象(它的模板参数是类类型,而不是指针)。std::vector允许在添加对象时在内存中移动对象,因此一旦发生这种情况,所有指向存储在其中的对象的现有指针都cells将变得悬空。您应该做的是将指针存储在向量中:

std::vector<Cell*> cells;
cells[pos]->setLeft(*cells[left]); //assuming setLeft() still takes a reference

std::shared_ptr实际上,使用智能指针 ( and ) 而不是原始指针可能会更好std::weak_ptr,但这是一个单独的主题。

于 2012-11-27T12:53:31.240 回答
1

您的setLeft函数正在使用Cellby const 引用,并且您正试图将其分配给指向const Cell. 您需要将指针分配给指针:

void setLeft(const Cell* left) {
    this->left = left;
}

然后你必须给它一个指向 a 的指针Cell。例如:

Cell a;
Cell b;
a.sefLeft(&b);
于 2012-11-27T12:46:09.753 回答
1

在单元格前添加 & 符号[左]。您所做的是将实例分配给指针值。

cells[pos].setLeft(&cells[left]);

一般来说,变量之前的 & 给出了这个变量的地址。

编辑:

编辑示例后,应将 & 替换为 *。变量之前的星号运算符为您提供指针中的实例(或引用)。简单地说... :-)

于 2012-11-27T12:46:28.757 回答