0

これはおそらく基本的な質問です。

構造体を使用して自分で定義したデータ型「プレーヤー」のベクトルがあります。

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

次に、これらのプレーヤーのデータ型のベクトルをパラメーターとして受け取る関数があり、構造体のメンバーにアクセスしたい

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

at(i)ベクトルの関数であるため機能します。ただし、アクセスできませんplayer_name。これはなぜですか、どうすれば解決できますか? これが基本的で退屈な場合はお詫び申し上げます。

4

4 に答える 4

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";
}
于 2011-06-08T14:41:20.293 に答える
1

あなたの問題は、 foo() が返されることですが、変更された player_name の副作用が見られないことだと思いますか?

これは、ベクターを参照ではなく値で foo() に渡したためです。foo() は、渡した元のベクターではなくベクターのコピーで動作しているため、関数が終了すると player_name の変更は失われます。

関数シグネチャを に変更してみてくださいvoid foo(vector<player>& players)

(パラメータを参照にするためにアンパサンドを追加したことに注意してください。)

于 2011-06-08T15:00:13.123 に答える
0

投稿したコードは問題ないので、コンパイル エラーは発生しません。実行時エラーが発生した場合は、ベクターにアクセスする前に、少なくとも 1 つのオブジェクトをベクターに挿入してください。

于 2011-06-08T14:41:56.023 に答える
0

ただの憶測

コンパイル エラーが発生した場合:

おそらく、構造体ではなくクラスを宣言します。

実行時エラーが発生した場合:

ベクトルは空です

エラーはありませんが、結果はありません:

ストリームをフラッシュしていません。std::endl を追加するか、std::cout.flush() を呼び出します

于 2011-06-08T14:45:08.930 に答える