0

私は C++ の初心者です (プログラミングの経験はありません)。私はテキストベースのゲームを書いており、ゲームの「人口」のために開発するコアモジュールがあります。これまでのところ、人口増加率 (事前に定義された出生率と死亡率に基づく) を確立しました。今私が求めているのは、市民ごとに固有のオブジェクトを作成することです。

Citizenクラスを作成し、ベクトルを使用して市民の初期集団を生成します。

vector<Citizen> myCitizens (100);

これら 100 人の市民それぞれにいくつかの初期値を設定する関数があります。問題ありません。

プログラムは「年」ごとに、その年の出生数と死亡数を計算します。その年の出生数に基づいて、 myCitizensベクトルに新しいオブジェクトを追加したいと考えています。

私はこの機能にこだわっています:

宣言:

int new_citizens(int newBirths);

意味:

int new_citizens(int newBirths)
{
myCitizens.push_back(newBirths);
}

コンパイラ ビルド メッセージ:

error: no matching function for call to 'std::vector<Citizen>::push_back(int&)'
note: candidate is:
note: void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = Citizen;  _Alloc = std::allocator<Citizen>; std::vector<_Tp, _Alloc>::value_type = Citizen]

私は問題を検索し、ドキュメントを見て、タイプを変更して無駄にしました。push_back が機能した例をまとめました。ベクトルを介してクラスオブジェクトを作成する場合、パズルの基本的なピースが欠けていると思います。

当時の私の現在の仮説は、型情報を間違って宣言しているか、ベクトルに情報を正しく渡していないというものです。これからも頑張ります。正しい方向への指針をいただければ幸いです。

ありがとうございました、

最適

4

3 に答える 3

4
vector<Citizen> myCitizens (100);

これは、クラスの 100 個のオブジェクトで構成されるvector名前を定義し、それぞれが で初期化されます。次に、あなたがやりたいことは、ベクターのサイズを変更して、オブジェクトの総数を含むようにすることであることが正しくわかった場合は、次の方法で実行できます。myCitizensCitizenCitizen()newBirthsCitizen

int new_citizens(int newBirths)
{
    // first we need to remove items, after this size() is 0
    myCitizens.clear();

    // and populate vector now
    for(unsigned int i = 0; i<newBirths; i++)
        myCitizens.push_back(Citizen());
}

これを達成するために使用することもできますstd::vector::resize

int new_citizens(int newBirths){
    myCitizens.resize(newBirths);
}

注: resizeコンテナーのサイズを使用すると、この関数の呼び出しで指定したとおりに調整されます。コンテナーのサイズは、現在のサイズが呼び出しで指定したサイズよりも大きい場合は縮小され、resize現在のサイズが より小さい場合は大きくなりnewBirthsます。

ただし、この数の新しいアイテムを既存のベクトルに追加する場合は、次の方法で実行できます。

int new_citizens(int newBirths)
{
    // just add new items
    for(unsigned int i = 0; i<newBirths; i++)
        myCitizens.push_back(Citizen());
}

または、サイズ変更を使用して、次のようにします。

int new_citizens(int newBirths){
    myCitizens.resize(myCitizens.size() + newBirths);
}
于 2013-09-03T00:56:14.433 に答える
0

クラス Citizen のオブジェクトを保持するようにベクトルを定義しました

vector<Citizen>

関数 push_back() は、タイプ value_type のオブジェクトを受け入れます。つまり、あなたの場合は Citizen です。

void push_back (const value_type& val);

コンストラクターで数値を渡すことができます

vector<Citizen> myCitizens (100);

数値を受け入れるコンストラクターがあるためです。

explicit vector (size_type n, const value_type& val = value_type(),
                 const allocator_type& alloc = allocator_type());

関数を機能させるには、代わりにループを記述できます。

for (int i = 0; i < newBirths; ++i)
{
    myCitizens.push_back(Citizen());
}

クリスが指摘したように、 resize() 関数を使用できます。実際、これはループよりもエレガントです。

myCitizens.resize(myCitizens.size() + newBirths)

std::vector resize()を参照してください

于 2013-09-03T00:53:20.090 に答える
0

newBirths ニュースの市民を追加したい場合は、次のようなループを実行します。

int new_citizens(int newBirths)
{
    for(unsigned int it = 0; it<newBirths; ++it)
        myCitizens.push_back(Citizen()); // <-- uses the default constructor
}
于 2013-09-03T00:54:11.477 に答える