簡體   English   中英

錯誤:&#39;std::__cxx11::list<User> ::iterator&#39; {aka &#39;struct std::_List_iterator<User> &#39;} 沒有名為 XXX 的成員

[英]error: 'std::__cxx11::list<User>::iterator' {aka 'struct std::_List_iterator<User>'} has no member named XXX

我正在學習 C++,但是我的第一堂課出錯了。 我需要幫助來理解這段代碼有什么問題。

我收到以下錯誤消息:

main.cpp:36:13: error: 'std::__cxx11::list<User>::iterator' {aka 'struct std::_List_iterator<User>'} has no member named
 'printInfo'
         usr.printInfo();
             ^~~~~~~~~

main函數提示用戶輸入姓名,創建列表和列表迭代器,顯示兩個用戶的Info

main()函數:

#include <iostream>
#include <list>
#include "User.cpp"
using namespace std;
int main() {
    string str0 ="";
    usrs players; 
    players = create_2user();
    list<User> playerList = { players.usr0, players.usr1 };
    for( list<User>::iterator usr = playerList.begin(); usr != playerList.end(); usr++) {
        usr.printInfo();
    }       
   return 0;
}

User

class User {
    string name;
    public:
        User();      
        void set_name (string in_name);     
        string get_name();
        void printInfo();
};
User::User()  { name="Unkonw"; }
void User::set_name(string in_name) { name  = in_name; }
string User::get_name() { return name; }
void   User::printInfo() { cout<<name; }

struct usrs { User usr0, usr1; };

usrs create_2user() {
    User array_usr[2];
    string str0;

    for(int i=0;i<2;i++) {
        cout<<"Enter player "<<i<<"'s name: ";
        cin>>str0;
        array_usr[i].set_name(str0);
    }
    usrs result = { array_usr[0], array_usr[1] };
    return result;
}

您嘗試在迭代器上調用成員函數printInfo到播放器實例,而不是用戶實例。 您可以通過以下方式解決此問題

for( list<User>::iterator usr = playerList.begin(); usr != playerList.end(); usr++) {
    usr->printInfo();
}

或使用范圍基礎 for 循環,它為您取消引用:

for (User& usr : playerList)
    usr.printInfo(); // Here, your original syntax works

如果您想對其進行過度設計,您還可以開始學習<algorithm>標頭和

#include <algorithm>

std::for_each(playerList.cbegin(), playerList.cend(),
    std::mem_fn(&User::printInfo));

對於初學者來說,在 C++20 中不會像上述用法那樣荒謬:

std::ranges::for_each(playerList, &User::printInfo);

請注意,由於printInfo()不會改變對象的任何狀態,因此您應該將此成員函數標記為const ,並在 for 循環、 for (const User& usr : playerList)和算法調用cbegin()/cend()范圍內使用const_iterator cbegin()/cend()

這個: list<User>::iterator usr聲明usr是一個迭代器。 在 C++ 中,迭代器類似於廣義指針——指向另一個對象(1) 的對象。 所以你必須把它當作一個指針來對待:如果你想訪問被指向的對象,你必須使用* (訪問對象)或-> (訪問對象的成員)來取消引用迭代器。 所以將for循環體中的語句改為:

usr->printInfo();

(1)區別在於指針指向地址,而迭代器指向容器中的位置。

暫無
暫無

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

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