4

これがコードです、それはかなり簡単です。

class Foo
{
public:
    void print()
    {
        std::cout<<"Foo::print\n";
    }
}; 


Game::Game()
{
    {
        Foo foo;
        player.onclick = bind(&Foo::print,foo);

    }
    player.onclick();
}

内部スコープが実行された後、fooオブジェクトはスコープ外になりますが、printメソッドは引き続き呼び出されます。これは、プレーヤーがfooオブジェクトへの参照を保持しているために発生すると思いますか?これを防ぐ方法はありますか?オブジェクトが破壊されることになっているときに、オブジェクトを存続させてイベントを受信させたくありません。

ありがとう。

4

3 に答える 3

6

foo;のコピーにバインドしています。そのコピーはバインドされた関数オブジェクトまで存続しますが、元のコピーはfooスコープの最後で破棄されます。

存続させたくない場合は、ポインター(&foo)または参照(std::ref(foo))にバインドします。foo次に、スコープ外になったら関数オブジェクトを呼び出さないように注意する必要があります。これが発生したことを関数オブジェクトから判断する方法がないことに注意してください。それを呼び出すと、未定義の動作が発生します。

オブジェクトが破棄されたときにオブジェクトを安全に切断するには、デストラクタが再割り当てするように手配するonclickか、他のオブジェクトに最初に再割り当てonclickしてからオブジェクトを破棄するように指示する必要があります。

于 2012-04-04T19:59:26.447 に答える
0

あなたの説明から、あなたは実際にイベントループが必要なように聞こえます。そのstd::bindようなものには便利ですが、それだけでは1つではありません。boost.signalsをご覧になることをお勧めします

于 2012-04-04T20:03:04.807 に答える
0

shared_ptrに割り当てるときに使用Fooし、にをPlayer保持するweak_ptr必要があると思います。次に、関数をロックして、まだ生きているかどうかを確認します。このようなもの:FooPlayerweak_ptronclickFoo

using namespace std;
class Foo
{
    public:
        void print()
        {
            cout<<"Foo::print\n";
        }
}; 

class Player
{
    public:
        weak_ptr<function<void()>> _onClickFuntion;
        void onclick()
        {
            shared_ptr<function<void()>> tempFunction(_onClickFunction.lock());
            if (tempFunction)
                tempFunction();
        }
}

Game::Game()
{
    {
        Foo foo;
        player._onClickFuntion = shared_ptr<function<void()>>(new bind(&Foo::print,foo));
    }
    player.onclick();
}
于 2012-05-11T13:45:52.050 に答える