指针作为成员变量

时间:2012-11-27 12:42:59

标签: c++ pointers vector

我想创建一个类,它有几个指向此类其他实例的指针。我想创造生命游戏,我可以设置邻居细胞。

我遇到的问题是我无法为我的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背景,所以也许我犯了一个大错。

3 个答案:

答案 0 :(得分:2)

你正在混合指针和引用(当你从java / net中传出时这是可以理解的)。在C ++中,明确区分:

  1. Cell x;,类Cell
  2. 的对象(实例)
  3. Cell *x;,指向Cell
  4. 实例的指针
  5. Cell &x;Cell
  6. 实例的引用(“其他名称”)

    Java“references”等同于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_ptrstd::weak_ptr)而不是原始指针实际上可能更好,但这是一个单独的主题。

答案 1 :(得分:1)

您的setLeft函数正在通过const引用获取Cell,并且您正在尝试将其分配给指向const Cell的指针。您需要指定指针指针:

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

然后你必须传给指向Cell的指针。例如:

Cell a;
Cell b;
a.sefLeft(&b);

答案 2 :(得分:1)

在细胞[左]之前添加&符号。你所做的是将实例分配给指针值。

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

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

编辑:

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