2016-07-08 107 views
0

在本書「C++併發在行動:實際多線程」由安東尼·威廉姆斯,我發現這個代碼示例C++私人互斥訪問

template<typename T> 
class threadsafe_stack 
{ 
private: 
    std::stack<T> data; 
    mutable std::mutex m; 
public: 
    threadsafe_stack(){} 
    threadsafe_stack (const threadsafe_stack& other) 
    { 
     std::lock_guard<<std::mutex> lock(other.m); 

    ... rest of the code. 

(在我的版的書,這是上市3.5)

爲什麼我可以直接訪問其他對象私有數據(在這種情況下是互斥量m)? 也許我錯過了什麼,或者這是一個錯字(我有俄羅斯版本的書,並沒有勘誤)

在此先感謝。

德米特里。

+4

沒什麼特別的,你可以從同一個類中的其他實例訪問'private'成員。 –

+0

什麼@πάνταῥεῖ說。實例可以在同一個_class_的其他實例中訪問私有數據。如果你想一想 - 這是複製構造函數可以工作的唯一方式(更不用說'operator ='等等)。 – davidbak

回答

1

這是完全正常的,private聲明只適用於子類和該類的使用,而不適用於同一類的其他實例。其實這就是operator=這樣的工作。

例如。

class A { 
    private: 
     int b; 
    public: 
     A() : b(rand()) {} 
     A& operator=(const A& rhs) { 
      b = rhs.b; 
     } 
}; 

class B : public A { 
    public: 
     void set(int newB) { 
      b = newB; // Not ok. 
     } 
}; 

int main() { 
    A a, aa; 
    a.b = 5; // Not ok. 

    a = aa; // Ok. 
} 
+0

非常感謝。看起來像這方面完全是我的腦袋。 – Dimitry

+0

@Dimitry,沒問題,也http://hyperboleandahalf.blogspot.com/2010/04/alot-is-better-than-you-at-everything.html –

+0

@ user4581301,是的,謝謝,修正。 –