[英]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 ++中,有以下明顯區別:
Cell x;
,是Cell
類的對象(實例) Cell *x;
,指向Cell
實例的指針 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_ptr
和std::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.