1

私はこのようなことをしたい:

class A {
public:
    void a_start () {
        // somewhere in A: my_b = new B();
        std::thread t(my_b->b_start);   // won't compile
    }

private:
    B* my_b;
};

class B {
public:
    void b_start();
};

ただし、コンパイルされません。http://accu.org/index.php/journals/1584を調べてみましたが、メンバー関数がnew-edオブジェクトにある場合については触れられていませんでした。正しい構文は何ですか?

4

2 に答える 2

0

メンバー関数へのポインターは、関数と同じではありません。に渡すことはできませんstd::thread。できることはmy_b、引数として取り、それを呼び出す関数を宣言してから、その関数とを にb_start渡すことです。または、これは C++11 であるため、おそらくラムダを使用できます。my_bstd::thread

void a_start() {
    std::thread t([](B* b){b->b_start();}, my_b);
}

(注:これを自分でコンパイルしようとしたことはありません)。

于 2012-08-22T02:27:55.210 に答える
0

std::bind の使用やトランポリン メンバー関数の使用など、これを実現する方法はたくさんありますが、おそらく次のようにラムダを使用するだけです。

std::thread t([&](){my_b->b_start();});
于 2012-08-22T02:34:22.157 に答える