2016-07-08 6 views
0

In Buch "C++ Concurrency in Aktion: Praktische Multithreading" von Anthony Williams fand ich diesen Code BeispielC++ Privat Mutex Zugang

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. 

(in meiner Version des Buches ist dies Listing 3.5)

Warum Ich habe direkten Zugriff auf andere Objekt private Daten (Mutex m in diesem Fall)? Vielleicht habe ich etwas verpasst oder vielleicht ist dies ein Tippfehler (Ich habe russische Version des Buches und es gibt keine Errata)

Vielen Dank im Voraus.

Dmitry.

+4

Nichts besonderes, können Sie 'private' Mitglieder von anderen Instanzen innerhalb der gleichen Klasse zugreifen. –

+0

Was @ πάνταῥεῖ sagte. Instanzen können auf private Daten in anderen Instanzen derselben _class_ zugreifen. Wenn Sie darüber nachdenken - dies ist die einzige Möglichkeit, wie Kopierkonstruktoren funktionieren können (ganz zu schweigen von 'operator =', etc etc). – davidbak

Antwort

1

Dies ist völlig normal, die private Deklaration bezieht sich nur auf untergeordnete Klassen und Verwendungen dieser Klasse, nicht auf andere Instanzen derselben Klasse. In der Tat funktionieren so Dinge wie operator=.

z.

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

Vielen Dank. sieht aus wie dieser Aspekt komplett aus meinem Kopf. – Dimitry

+0

@Dimitry, kein Problem, auch http://hyperboleandahalf.blogspot.com/2010/04/alot-is-better-than-you-at-everything.html –

+0

@ user4581301, yep, danke, behoben. –