我正在嘗試使用標準制作一個專案std::list
。有一個必須由多個類訪問的名稱串列。該串列必須在一個類中。我目前正在嘗試使用此代碼:
class MyClass {
private:
list<string> myList = {"one","two","three"};
public:
list<string> GetList()
{
return myList;
}
};
我要從中訪問串列的類
class CallingClass {
MyClass myClass;
public:
void GetList()
{
list<string> calledList = myClass.GetList();
for(int x=0;x<4;x ) {
cout<<calledList[x]<<endl; // I get error in this line: "no match for operator[]"
}
}
};
主要的
int main()
{
CallingClass call;
call.GetList();
return 0;
}
我很無知。
uj5u.com熱心網友回復:
for(int x=0;x<4;x ) { cout<<calledList[x]<<endl; }
for
這個回圈有兩個問題:
回傳的
std::list
只有 3 個元素,但您嘗試訪問 4 個元素,因此回圈的最后一次迭代將超出范圍,這是未定義的行為。沒關系,因為
std::list
沒有一個operator[]
定義開始,這是編譯器警告你的。這是因為std::list
不是像 is 那樣的隨機訪問容器std::vector
,所以你不能通過索引訪問它的元素。您必須改為遍歷std::list
using 迭代器。
試試這個:
list<string>::iterator iter = calledList.begin();
for(size_t x = 0; x < calledList.size(); x ) {
cout << *iter << endl;
iter;
}
或者:
for(list<string>::iterator iter = calledList.begin(); iter != calledList.end(); iter) {
cout << *iter << endl;
}
然后可以通過使用range-for
回圈(在 C 11 及更高版本中)進一步簡化,該回圈在內部為您處理迭代器:
for(auto &elem : calledList) {
cout << elem << endl;
}
uj5u.com熱心網友回復:
無論如何,這與哪些類想要從哪個其他類訪問無關。這是更根本的東西。
cout<<calledList[x]<<endl;
calledList
是一個std::list
。std::list
s沒有多載[]
運算子。只有std::vector
s做。要么用向量替換你的串列,要么使用其他方式來迭代一個串列。使用現代 C 進行范圍迭代怎么樣?
for (auto &l : calledList)
cout << l << endl;
此外:
for(int x=0;x<4;x ) {
即使你可以使用[]
a list
,你還有另一個問題。回圈最終將訪問容器中的前四個值。顯示的容器只有三個值。這將導致未定義的行為。
總結一下:
std::list
s 沒有[]
運算子。使用范圍迭代和現代 C ,可以生成更安全、更易讀的代碼。
uj5u.com熱心網友回復:
您還有其他兩個答案可以解釋您的問題。我還要指出一件事:
const list<string> & GetList()
{
return myList;
}
...
const list<string> & calledList = myClass.GetList();
我做了非常細微的改變。您的版本回傳串列的副本。這是低效的。相反,您應該回傳一個 const 參考。請注意,我添加了const
關鍵字和&
字符。
然后當我使用它時,我還將串列設為 const 參考。
現在,如果你真的需要一個 COPY,你仍然可以這樣做:
list<string> calledList = myClass.GetList();
這最終會和你的版本做同樣的事情。但大多數時候,您只會以某種 const 方式讀取串列,因此您可以通過回傳 const 參考然后將其分配給 const 參考來節省大量作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/472993.html
上一篇:將右值傳遞給函式