2016-05-15 7 views
0

クラスのメンバーにアクセスして、std::threadでメンバーを変更したいと考えています。ここstd :: threadでクラスメンバーを操作する

は一例であり:

class bar { 
public: 
    int a = 5; 
    void change_a() { 
     a = 10; 
     cout << "thread's a=" << a << endl; 
    } 
}; 

int main(int argc, char ** argv) 
{ 
    bar object1; 

    std::thread t1(&bar::change_a,bar()); 
    t1.join(); 

    cout << "object's a=" << object1.a << endl; 
    return 0; 
} 

結果であった:

スレッドのA = 10

オブジェクトのA = 5

だからスレッド関数変数を変更して印刷しましたが、明らかにオブジェクト1を変更しませんでした。私はそれを印刷したときに、それはまだ同じだった(5)。

私の質問は、ここで変数はどこにありますか?オブジェクトがない場合は10、どうすればそれを使用できますか?

答えて

1

スレッドは独立したコード実行に従います。

これを変更するには、変更が必要なオブジェクトのアドレスを渡す必要があります。 C++のよう

bar object1; 
std::thread t1(&bar::change_a, &object1); 

、メンバー関数は、オブジェクトの内容のさらなる修飾のために使用されるサイレントこのポインタと呼ばれます。したがって、これを正しく渡すと、これを達成することができます。

this pointer C++

+0

ありがとうございました、作業しているオブジェクトへのポインタを渡してください! 構文のことですが、change_aに引数があるとします。 void change_a(int x); と言うと、私はそれを50にしたいと言っています、私のラインは単にこのように見えますか? std :: thread t1(&bar :: change_a、50、&object1); – acv17

+1

心配しないで、これを解決しました。 – acv17

3
std::thread t1(&bar::change_a, bar()); 
           ^^^ 

ここでは、一時的なbarオブジェクトを作成しました。次に、このbarオブジェクトでchange_aと呼ぶので、a10になります。ステートメントが終了すると、変数aを含む一時的なbarオブジェクトが破棄されます。

object1は、それだけで別のbarのオブジェクトだ、とあなたはobject1からobject1change_aaを呼び出していないため5あり、そのbarとは何の関係もありません。

質問に答えるには、タイプbarの2つのオブジェクトを作成していますが、barにはchange_aしか呼び出していません。

+0

の詳細を知っている、この明確な説明のためにありがとうございました。私は今これを理解しています。 – acv17

関連する問題