簡體   English   中英

指針作為成員變量

[英]Pointer as a member variable

我想創建一個類,該類具有指向該類其他實例的多個指針。 我想創建可以設置鄰居單元格的生活游戲。

我的問題是我無法為我的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背景,所以也許我犯了一個大錯誤。

您正在混合使用指針和引用(當您從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;鍵入std::vector<Cell> cells;否則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 )代替原始指針可能會更好,但這是一個單獨的主題。

您的setLeft函數正在按const引用獲取Cell ,而您正嘗試將其分配給指向const Cell的指針。 您需要將一個指針分配給一個指針:

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

然后,您必須向其傳遞指向Cell的指針。 例如:

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

在單元格前添加“&”號(左)。 您要做的是將實例分配給指針值。

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

通常,變量前的&為您提供此變量的地址。

編輯:

編輯示例后,應將&替換為*。 變量前的star運算符為您提供了指針的實例(或引用)。 簡單地說... :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM