2016-07-08 3 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)

Почему У меня есть прямой доступ к другим частным данным объекта (mutex m в этом случае)? Возможно, я что-то пропустил или, может быть, это опечатка (у меня есть русская версия книги и нет ошибок)

Заранее спасибо.

Dmitry.

+4

Ничего особенного, вы можете получить доступ к частным членам из других экземпляров одного и того же класса. –

+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, да, спасибо, исправлено. –

Смежные вопросы