簡體   English   中英

在C ++中存儲指向vector的指針的類

[英]Class storing pointers to vector in C++

我正在實現一個類Aviary,它可以存儲指向Bird對象的指針。 現在,我有以下內容:

class Aviary {

public:
    const Bird &operator[](const size_t index) const {
    return birds[index];
    }

    Bird &operator[](const size_t index) {
    return birds[index];
    }

private:
    std::vector<Bird*> birds;

Bird對象存儲為指針,以避免對象切片。 但是,運算符[] - 實現存在問題(類型'const Bird'的引用無法綁定到'const value_type'的左值(又名'Bird * const'))。

如何正確實現operator []?

由於存儲指針,因此應dereference返回dereference的指針。

const Bird &operator[](const size_t index) const {
return *birds[index];
}

Bird &operator[](const size_t index) {
return *birds[index];
}

旁注:使用智能指針,而不是原始指針。

兩個旁注:

  1. const由值(通過參數const size_t index )是無用的,你的編譯器會忽略它。 您可以嘗試使用const聲明它並刪除實現中的const :編譯器將正確地認為您的實現與聲明匹配。
  2. 實現operator[]的非const版本的規范方法如下:

如下

Bird &operator[](size_t index) {
  return const_cast<Bird&>(const_cast<const Aviary*>(this)->operator[](index));
}

我知道所有那些const_cast看起來很難看,但它們都是安全的,這是確保operator[]兩個版本都做同樣的正確方法(你只需要從現在開始維護const版本),同時也確保你沒有在const版本中做任何非const操作。

除此之外,你的代碼的問題在於你正在返回指針,而不是(引用)它們指向的值,正如Luchian和ForEveR已經指出的那樣。

你需要取消引用:

return *(birds[index]);

birds[index]是一只Bird* ,所以你不能直接將它作為Bird&返回。

暫無
暫無

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

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