0

次のコードは、ベクトルの参照を関数に渡すことをテストするためのものです。ただし、未知の障害が発生します。gdb から次のようなエラー メッセージが表示されました。

http://i.stack.imgur.com/8wkCu.jpg

ソースは次のとおりです。

#include<iostream>
#include<vector>
using namespace std;
class ROLE
{
    public:
        ROLE(int);
        int HP;
};
ROLE::ROLE (int input)
{
    HP = input;
}

void checkVector(vector<ROLE>&input);
int main()
{
vector<ROLE> R;
    ROLE K(102);
    R.push_back(K);
    K.HP = 111;
    R.push_back(K);
    checkVector(R);

    return 1;
}
void checkVector(vector <ROLE> & input)
{
    cout<<"size of vector "<<input.size()<<endl;
    for(int i =0; i<input.size();i++)
    {
        cout<< input[i].HP<<endl;
    }
}

エラーの理由がわかりません。どんなアイデアでも大歓迎です!

次のようにコードを変更した場合にもエラーが発生するため、おそらく push_back からのエラーであることに気付きました。何が起こったのかについて何か考えはありますか?

#include<iostream>
#include<vector>
using namespace std;
class ROLE
{
    public:
        ROLE(int);
        int HP;
};
ROLE::ROLE (int input)
{
    HP = input;
}
int main()
{
    vector<ROLE> R;
    ROLE K(0);
    K.HP=1;
    R.push_back(K);
    K.HP = 113;
    R.push_back(K);
    K.HP = 111;
    R.push_back(K);


    return 0;
} 

可能な答え:

エラーを回避できる方法が1つあります。以下はノーエラーソースです。

#include<iostream>   
#include<vector>
using namespace std;
class ROLE
{
    public:
        ROLE(int);
        void constructAry(int inputHP);
        int HP;
};  
ROLE::ROLE (int input)
{
    HP = input;
}
void ROLE::constructAry(int inputHP)
{
    HP = inputHP;
}
void checkVector(vector<ROLE>&input);
int main()
{
    vector<int> test;
    vector<ROLE> R;
    ROLE K(0);
    K.constructAry(1);
    R.push_back(K);
    K.constructAry(2);
    R.push_back(K);
    K.constructAry(3);
    R.push_back(K);
    K.constructAry(4);
    R.push_back(K);
    checkVector(R);
    return 1;
}

void checkVector(vector <ROLE> & input)
{
    cout<<"size of vector "<<input.size()<<endl;
    for(int i =0; i<input.size();i++)
    {
        cout<< input[i].HP<<endl;
    }
}

したがって、コンストラクターのような関数を使用して同じオブジェクトの値を変更し、ベクター内のオブジェクトを push_back すると、バグを効果的に回避できるようです。

理由は私にはあいまいです。多分メモリアドレスの問題です。

4

0 に答える 0