Здравствуйте, Hard_Club, Вы писали:
H_C>struct A H_C>{ H_C> void setA(int _a) {a = _a;}; H_C>private: H_C> int a; H_C>};
H_C>int _tmain(int argc, _TCHAR* argv[]) H_C>{ H_C> A a; H_C> a.setA(1);
H_C> A b = a;
H_C> b.setA(2); H_C> a = b;
H_C> return 0; H_C>}
H_C>Мембер а — приватный, а в struct A нет friend деклараций.
Я уже заметил, что вы не в состоянии членораздельно излагать свои мысли. Дети ито лучше это делают!
Во-первых, что не должно работать?! Вы в состоянии это выразить? И причем здесь спецификатор friend? В каком месте вашего кода он должен использоваться?
Здравствуйте, Сыроежка, Вы писали:
С>Здравствуйте, Hard_Club, Вы писали:
H_C>>struct A H_C>>{ H_C>> void setA(int _a) {a = _a;}; H_C>>private: H_C>> int a; H_C>>};
H_C>>int _tmain(int argc, _TCHAR* argv[]) H_C>>{ H_C>> A a; H_C>> a.setA(1);
H_C>> A b = a;
H_C>> b.setA(2); H_C>> a = b;
H_C>> return 0; H_C>>}
H_C>>Мембер а — приватный, а в struct A нет friend деклараций. С> Я уже заметил, что вы не в состоянии членораздельно излагать свои мысли. Дети ито лучше это делают! С>Во-первых, что не должно работать?! Вы в состоянии это выразить? И причем здесь спецификатор friend? В каком месте вашего кода он должен использоваться?
обращение к private-мемберам другого екземпляра того же класса, например в такой ситуации:
struct A
{
void copyFrom(A &_source) {a = _source.a;};
private:
int a;
};
Здравствуйте, Hard_Club, Вы писали:
H_C>Здравствуйте, Сыроежка, Вы писали:
С>>Здравствуйте, Hard_Club, Вы писали:
H_C>>>struct A H_C>>>{ H_C>>> void setA(int _a) {a = _a;}; H_C>>>private: H_C>>> int a; H_C>>>};
H_C>>>int _tmain(int argc, _TCHAR* argv[]) H_C>>>{ H_C>>> A a; H_C>>> a.setA(1);
H_C>>> A b = a;
H_C>>> b.setA(2); H_C>>> a = b;
H_C>>> return 0; H_C>>>}
H_C>>>Мембер а — приватный, а в struct A нет friend деклараций. С>> Я уже заметил, что вы не в состоянии членораздельно излагать свои мысли. Дети ито лучше это делают! С>>Во-первых, что не должно работать?! Вы в состоянии это выразить? И причем здесь спецификатор friend? В каком месте вашего кода он должен использоваться?
H_C>обращение к private-мемберам другого екземпляра того же класса, например в такой ситуации:
H_C>struct A H_C>{ H_C> void copyFrom(A &_source) {a = _source.a;}; H_C>private: H_C> int a; H_C>};
Дело втом, что управление доступом private определяется следующим образом ( Стандарт С++ 2003 11.1 ): "private, that is, its name can be used only by members and friends of the class in which it is declared;"
То есть здесь говорится не о членах коонкретного объекта, а о членах класса и о членах друзей класса. То есть члены класса иогут обращаться к закрытым членам класса. Именнно это позволяет компилятору самостоятельно генерировать конструктор копирования по умолчанию и копирующий оператор присваивания. Если бы этого не было бы, то компилятор не смог бы генерировать эти специальные функции класса. То есть изначально исходили из концепции языка С, что объект структуры одного типа может быть присвоен объекту структуру того же типа, так как в С нет управления доступом.
Здравствуйте, Hard_Club, Вы писали:
H_C>struct A H_C>{ H_C> void setA(int _a) {a = _a;}; H_C>private: H_C> int a; H_C>};
H_C>int _tmain(int argc, _TCHAR* argv[]) H_C>{ H_C> A a; H_C> a.setA(1);
H_C> A b = a;
H_C> b.setA(2); H_C> a = b;
H_C> return 0; H_C>}
H_C>Мембер а — приватный, а в struct A нет friend деклараций.
Прочитай про default copy constructor, assignment operator.
С>Дело втом, что управление доступом private определяется следующим образом ( Стандарт С++ 2003 11.1 ): "private, that is, its name can be used only by members and friends of the class in which it is declared;" С>То есть здесь говорится не о членах коонкретного объекта, а о членах класса и о членах друзей класса. То есть члены класса иогут обращаться к закрытым членам класса. Именнно это позволяет компилятору самостоятельно генерировать конструктор копирования по умолчанию и копирующий оператор присваивания. Если бы этого не было бы, то компилятор не смог бы генерировать эти специальные функции класса. То есть изначально исходили из концепции языка С, что объект структуры одного типа может быть присвоен объекту структуру того же типа, так как в С нет управления доступом.
А можно ли явно запретить доступ к private-мемберам из других екземпляров?
Здравствуйте, Hard_Club, Вы писали:
С>>Дело втом, что управление доступом private определяется следующим образом ( Стандарт С++ 2003 11.1 ): "private, that is, its name can be used only by members and friends of the class in which it is declared;" С>>То есть здесь говорится не о членах коонкретного объекта, а о членах класса и о членах друзей класса. То есть члены класса иогут обращаться к закрытым членам класса. Именнно это позволяет компилятору самостоятельно генерировать конструктор копирования по умолчанию и копирующий оператор присваивания. Если бы этого не было бы, то компилятор не смог бы генерировать эти специальные функции класса. То есть изначально исходили из концепции языка С, что объект структуры одного типа может быть присвоен объекту структуру того же типа, так как в С нет управления доступом.
H_C>А можно ли явно запретить доступ к private-мемберам из других екземпляров?
Я такой синтаксической конструкции не знаю, которая позволяет это делать. то есть когда вы определяете класс, то еще совершенно ничего не известно, какие объекты этого класса будут созданы. Определение класса является описанием типа. И все объекты класса имеют одинаковый тип.
Здравствуйте, Hard_Club, Вы писали:
С>>Дело втом, что управление доступом private определяется следующим образом ( Стандарт С++ 2003 11.1 ): "private, that is, its name can be used only by members and friends of the class in which it is declared;"
H_C>А можно ли явно запретить доступ к private-мемберам из других екземпляров?
Защититься от явного:
A a,b;
::memcpy(&a, &b, sizeof(A));
в сях/в плюсах вы в принципе не сможете, даже переопределив все конструкторы. Сформулируйте цель (т.е. "я написал вот так: X, но мне не нравится, что другой программист может сделать Y") и можно будет обсудить способы этого избежать. Есть широкий набор методов, от виртуального интерфейса и opaque pointer-ов до всяких тяжеловесных технологий. Осталось только выяснить, чего вы хотите добиться
Здравствуйте, Hard_Club, Вы писали:
H_C>Мембер а — приватный, а в struct A нет friend деклараций.
Если не объявлять вручную конструктор копирования, компилятор генерирует по-умолчанию простейший его вариант — поочередное присваивание каждого члена структуры, а любой приватный член доступен любому методу.
Здравствуйте, Hard_Club, Вы писали:
H_C>struct A H_C>{ H_C> void setA(int _a) {a = _a;}; H_C>private: H_C> int a; H_C>};
H_C>int _tmain(int argc, _TCHAR* argv[]) H_C>{ H_C> A a; H_C> a.setA(1);
H_C> A b = a;
H_C> b.setA(2); H_C> a = b;
H_C> return 0; H_C>}
H_C>Мембер а — приватный, а в struct A нет friend деклараций.