0

barsいくつかの色付きのボックス オブジェクトを含むベクターがあります。各ボックス オブジェクトには、独自の描画および更新機能があります。各ボックスは、画面の一方の端から次の端に移動します。画面の外にある場合は、ボックスを削除する必要があります。イテレータを使用してボックスを移動し、画面の外にあるときを判断しています。

私は c++ に非常に慣れていないため、コードを機能させるのに問題があります。ベクトルからオブジェクトを消去する関数がエラーを出していますReference to non static member function must be called。静的メンバーと非静的メンバーについて調べていますが、まだ少し迷っています。

これは、関連するコードを含むメインのヘッダー ファイルです。

class game : public ofxiPhoneApp {
    public:
    void setup();
    void update();
    void draw();
    void exit();

    vector <Colorbar> bars;
    bool checkBounds (Colorbar &b); 
};

私の game.mm ファイルでは、ベクターを作成し、それを繰り返し処理して、色付きのバー オブジェクトのプロパティを設定します。

void game::setup(){
    bars.assign(5, Colorbar());
    for (int i = 0; i<bars.size(); i++) {
        ofColor color = colors.giveColor();
        bars[i].setup();
        bars[i].setColor(color.r,color.g,color.b);
        bars[i].setWidth(50);
        bars[i].setPos(ofGetScreenHeight()-(i*50), 0);
    }
}

バーを画面上で移動する更新機能。

void game::update(){
    for(vector<Colorbar>::iterator b = bars.begin(); b != bars.end(); b++){
        (*b).update();
    }
    //this is the part that gives the error
    bars.erase((remove_if(bars.begin(), bars.end(), checkBounds),bars.end()));

}

ボックスが範囲外かどうかを確認する関数は次のとおりです

bool game::checkBounds (Colorbar &b){

    if (b.pos.x > ofGetScreenHeight()+50) {
        // do stuff with bars vector here like adding a new object

        return true;
    } else {
        return false;
    }
}

私はいくつかの実験を行いましたbool checkBounds (Colorbar &b); .ヘッダーファイルから削除して非静的にすることで、コードが機能します。barsしかし問題は、古いオブジェクトが削除されたときに新しいオブジェクトを追加するために、その関数のベクトルにアクセスできるようにしたいということです。そして、それはもううまくいきません。

どうすればこれを解決できますか?

4

1 に答える 1

5

を取る単項ファンクタが必要ですColourBar。メンバー関数には、 の暗黙的な最初のパラメーターがありますthis。これは、次のように呼び出すことができないことを意味します。

Colorbar cb;
game::checkBounds(cb);

クラスのインスタンスにバインドする必要があります。そうしないと、そのインスタンスの他のメンバーにアクセスできなくなります。checkBoundsしたがって、メンバー関数を のインスタンスにバインドする必要がありますgame。あなたの場合、thisバインドする適切なインスタンスのように見えます:

#include <functional> // for std::bind

using std::placeholders; // for _1
...
remove_if(bars.begin(), bars.end(), std::bind(&game::checkBounds, this, _1)) ...
于 2013-08-05T11:40:12.057 に答える