[英]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];
}
旁注:使用智能指針,而不是原始指針。
兩個旁注:
const
由值(通過參數const size_t index
)是無用的,你的編譯器會忽略它。 您可以嘗試使用const
聲明它並刪除實現中的const
:編譯器將正確地認為您的實現與聲明匹配。 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.