1

私は、最後の引数として 4 つの文字列、4 つの int および vector(int) を持つ Client クラスを作成する必要がある学校の作業に取り組んできました。問題は、ベクトルのすべての要素を印刷したいときに、ミューテーターを直接使用すると、ナンセンスを印刷することです。

vector<int> v_int;
vector<int>::iterator it_v_i;
v_int.push_back(2);
v_int.push_back(3);
v_int.push_back(7);
v_int.push_back(1);

Client client("nom1", "prenom1", "adress1", "city1", "comment1", 1240967102, 44522, 5, 10, v_int);

v_int = client.getIdResources();
for (it_v_i = v_int.begin(); it_v_i != v_int.end(); it_v_i++) {
    cout << *it_v_i << ", ";
}

期待どおりに 2,3,7,1 を出力しますが、次のコード

for (it_v_i = client.getIdResources().begin(); it_v_i != client.getIdResources().end(); it_v_i++) {
    cout << *it_v_i << ", ";
}

不明な番号 (3417664... など) を出力、不明な番号、7、1

なぜこれが起こっているのか本当に理解できません

編集 :

コンストラクター:

Client::Client(const string& name, const string& surname, const string& adress, const string& city, const string& comment,
            const int& phoneNb, const int& postalCode, const int& termAppointment, const int& priority, const vector<int>& idResources)
                : name(name), surname(surname), adress(adress), city(city), comment(comment), phoneNumber(phoneNb),
                postalCode(postalCode), termAppointment(termAppointment), priority(priority), idResources(idResources)

{ }

ミューテーター :

std::vector<int> getIdResources() const{ return idResources; }
4

1 に答える 1

3

問題は、2 番目のスニペットで、 andイテレータを取得するために2 つの一時的なが使用されていることです (宣言がand notであると仮定します)。これは、が destructed の要素を参照していることを意味します。逆参照されると、未定義の動作が発生します。vectorbegin()end()std::vector<int> client.getIdResources()std::vector<int>& client.getIdResources()it_v_istd::vectorit_v_i

2 番目のコード スニペット関数を正しく機能させるにstd::vectorは、 によって が返される必要がありますclient.getIdResources()。ただし、内部クラス メンバーへの参照を返すと、有効期間の問題など、他の問題が発生します。

于 2014-03-06T11:09:37.697 に答える