2

ここに私の問題があります。特定のクラスのオブジェクトのベクトルが必要で、それを他のクラスに渡して使用できます。

Vector がそのクラスのコンストラクター内にクラスのインスタンスを追加するようにします。したがって、クラスメンバー内に静的ベクトルを設定し、コンストラクターで push_back(this) を試してみたいと思います。

現在動作中のクラスは 2 つあります。1 つは、左クリックがあるたびに「Obstacle」クラス (ベクトルが必要なクラス) のインスタンスを作成するイベント ハンドラー クラスです。

(関係のないコードは省略しています)

class MyEventReceiver: public IEventReceiver
{
private:
    blah blah


public:
    blah blah

virtual bool OnEvent (const SEvent& event){
    if(left click)
       Obstacle obs(scn,randX,randY,randR);
}

}

Obstacle.h:

class Obstacle
{
private:

    static std::vector<Obstacle> *obs;

public:

    Obstacle(scene::ISceneManager*, float, float, float);
    ~Obstacle();
};

障害物の cpp:

std::vector<Obstacle> *Obstacle::obs;

Obstacle::Obstacle(scene::ISceneManager* scn, float x, float y, float radius)
{
    //get and set the passed in params blah blah

    obs->push_back(this);


}

これは機能しませんが、うまくいけば、私が達成しようとしていることがわかります。後で、obs への参照を返す関数が必要なため、他のクラスがこの関数を呼び出して、ベクトルにアクセスして操作および読み取りを行うことができます。

4

3 に答える 3

2

ベクトルを変更して、個別のコピーが必要ないため、値ではなくポインタで格納するようにします。

static std::vector<Obstacle*> *obs;

デストラクタのこのベクトルからインスタンスを削除することを忘れないでください。

Obstacle::~Obstacle()
{
    auto iter = std::find(obj->begin(), obj->end(), this);
    if (iter != obj->end())
    {
        obj->erase(iter);
    }
}

また、それを追加するコピーコンストラクターを作成する必要があります。これを行わないと、コピーを追跡できなくなります(これを許可すると仮定します)。

Obstacle::Obstacle(const Obstacle& rhs)
    // ... initialise from rhs
{
    obs->push_back(this);
}
于 2012-11-02T13:39:51.500 に答える
2
  1. obsポインターとして持たないでください。その必要はありません。
  2. obsオブジェクトのベクトルとして宣言されます。はオブジェクトへのポインタなので、次のようthisに呼び出す必要がありますpush_backobs->push_back(*this);
于 2012-11-02T13:27:50.657 に答える
1

あなたのベクトルは間違っていると宣言されています。そのはず

static std::vector<Obstacle*> obs;

つまり、ポインターのベクトルです。あなたが持っていたのは、ベクトルへのポインターでした。

構築されたすべての Obstacle オブジェクトへのポインタのベクトルを維持することが目標であると仮定すると、コピー コンストラクタ (コピーされた Obstacle オブジェクトもベクトルに追加する必要があります) とデストラクタ (オブジェクトをオブジェクトを削除する必要があります) も宣言する必要があります。ベクトル)。これは効率的ではありませんが、ニーズには問題ないかもしれません。

于 2012-11-02T13:31:37.870 に答える