2011-06-08 27 views
0

這可能是一個基本問題。初學者的問題:爲什麼我不能在一個向量中訪問一個對象的成員?

我有我已經使用一個結構定義自己是一個數據類型「播放器」的一個矢量:

struct player { 
    string player_name; 
    string label; 
    ... 
    ... 
} 

然後我具有功能服用這些播放機的數據類型的一個向量作爲參數,我想訪問結構中的成員即

void foo(vector<player> players) { 
    cout << players.at(0).player_name; 
} 

at(i)可以工作,因爲它是矢量的函數。但是,我無法訪問player_name。爲什麼是這個,我該如何解決它?道歉,如果這是基本和無聊。

+1

您可以訪問它。發佈一些可編譯的代碼,說明你爲什麼認爲你不能。 – 2011-06-08 14:39:19

+3

「無法訪問」是什麼意思?編譯器錯誤?運行時錯誤? – badgerr 2011-06-08 14:39:29

+0

它應該工作。你爲什麼說它不? – CharlesB 2011-06-08 14:39:33

回答

2

下面的代碼訪問的球員矢量:

#include <string> 
#include <vector> 
using namespace std; 

struct player { 
    string player_name; 
    string label; 
}; 

int main() { 
    vector <player> p; 
    p.push_back(player()); 
    p.at(0).player_name = "fred"; 
} 
0

因爲你發佈的代碼是罰款你不應該得到一個編譯錯誤。如果您遇到運行時錯誤,請確保在嘗試訪問它之前,至少已將一個對象插入向量中。

0

只是猜測

如果你得到一個編譯錯誤:

可能是你聲明一個類,而不是一個結構。

如果你得到一個運行時錯誤:

向量是空

沒有錯誤,但不會導致:

你還沒有刷新流。添加std :: endl或調用std :: cout.flush()

1

你的問題是,foo()返回,但你沒有看到更改的player_name的副作用,我猜?

這是因爲你已經通過值而不是引用將向量傳遞給foo()。 foo()在向量的副本上運行,而不是傳遞給它的任何原始數據,所以當函數結束時,player_name更改會丟失。

嘗試將功能簽名更改爲void foo(vector<player>& players)

(請注意,我添加了「&」符號使參數成爲參考。)

相關問題