0

クラスに関数があり、多かれ少なかれ次のように機能します。

class Player {
private:
    Object* minions[16]
public:
    void Summon(Object* obj);
};

Player::Summon(Object* obj) {
    static int i = 0;
    if (i == 16)
        return;
    minions[i] = obj;
    i++;
}

次のように、複数のプレーヤーを使用しようとすると問題が発生します。

Player playerone;
Player playerthree;
playerone.Summon(new Object("o1"));
playerthree.Summon(new Object("o2"));

o1playerone.minions[0]予想どおり にo2ありますが、は同じ変数を使用playerthree.minions[1]する関数の にあります。関数が単一のインスタンスに静的変数を使用するようにする方法はありますが、インスタンスごとに個別の変数を使用しますか? equal toの最初の場所へのループを作成したり、のメンバーを直接作成したりできることはわかっていますが、これらのいずれかを実行する前に、より良い方法があるかどうかを知りたいです。Summon()iSummon()iiforminions[]NULLiPlayer

4

4 に答える 4

2

に変更Object* minions[16];std::vector<Object*> minions;ます。そうすれば、配列インデックスのことを気にせずにminions.size()、いくつあるかを知るために使用したり、1 つ追加したりすることができます。minions.push_back(obj);

于 2010-12-02T22:50:40.620 に答える
1

iそれぞれを単純に入れてみませんPlayerか?のような名前に変更しますがsummonned_minion_count、それが実際の目的です。

于 2010-12-02T22:48:28.787 に答える
0

iのメンバー変数を作成する必要がありますPlayer

または、次のようなことを行うこともできます。

#include <vector>

class Player {
private:
    static int const MAX_MINION_COUNT = 16;
    std::vector<Object *> minions;
public:
    void Summon(Object* obj) {
        if (minions.size() < MAX_MINION_COUNT) {
            minions.push_back(obj);
        }
    }
};
于 2010-12-02T22:48:12.630 に答える
0

ローカル変数を静的にすることは、効果的にそれをグローバルにすることです。iのデータメンバーを作成するだけですclass Player。そして、おそらくもっとわかりやすい名前を付けてください。

于 2010-12-02T22:48:17.120 に答える