forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   private (http://forum.boolean.name/showthread.php?t=16628)

impersonalis 11.04.2012 22:24

private
 
Я всегда считал, что private закрывает доступ к полям для всех кроме экземпляра-владельца. Однако сейчас заметил, что данный код на GCC указывает всего на одну ошибку.
Код:

#include <conio.h>
#include <iostream>

using namespace std;

class foo{
    private:
        int bar;
    public:
        bool check(const foo &baz)const;
};

inline bool foo::check(const foo &baz)const{
    return (this->bar==baz.bar);
}

int main()
{
    foo a;
    a.bar=1;
    getch ();
    return 0;
}

Как жить? Я блуждал в темноте? По приведённому выше коду можно утверждать, что private закрывает поля лишь для других классов и функций (если только те не дружественные).
В Бьерн Страуструп Язык программирования C++. Специальное издание. Пер. с англ. — М.: Издательство Бином, 2011 г. — 1136 с: ил. формулировка, не противоречащая ни первому варианту, ни второму.
Пользователи студии отпишитесь, пожалуйста!

Knightmare 11.04.2012 22:31

Ответ: private
 
По стандарту приватный член инкапсулирован в контексте класса. Объект может прямую доставать поля других объектов того же класса, такие дела.

HolyDel 11.04.2012 22:32

Ответ: private
 
Цитата:

Я блуждал в темноте?
да.
private закрывает доступ к полям для всех кроме класса-владельца. не экземпляра

impersonalis 11.04.2012 22:48

Ответ: private
 
Перечитал текст лекции, рассказанной студентам в прошлом году - там всё правильно (как Knightmare написал). Фух - значит помутнение какое-то у меня.

ffinder 12.04.2012 11:44

Ответ: private
 
Цитата:

Сообщение от Knightmare (Сообщение 225169)
По стандарту приватный член инкапсулирован в контексте класса. Объект может прямую доставать поля других объектов того же класса, такие дела.

ну и как после такого можно говорит что Бъярне дружит с головой???
зачем инкапсуляция ваще? для того, чтобы никто кроме экземпляра класса (объекта) не лез к нему внутрь, а доступ к внутренним данным получал только через геттеры.
походу было так: бъярне не понял нихера и сделал как получилось.
минутка негодования закончена.

Knightmare 12.04.2012 12:15

Ответ: private
 
Цитата:

ну и как после такого можно говорит что Бъярне дружит с головой???
зачем инкапсуляция ваще? для того, чтобы никто кроме экземпляра класса (объекта) не лез к нему внутрь, а доступ к внутренним данным получал только через геттеры.
походу было так: бъярне не понял нихера и сделал как получилось.
минутка негодования закончена.
Мне похуй. Но ты можешь не писать на плюсах, чо.

impersonalis 14.04.2012 01:52

Ответ: private
 
На самом деле, всё можно логично обосновать:
Твой класс - твои правила. В плане: никто кроме разработчика библиотеки не должен писать методы класса. Все остальные взаимодействующие объекты (сторонние библиотеки) как раз будут довольствоваться паблик-интерфейсом.
Для того чтобы "следить за собой" можно воспользоваться другими инструментами языка: выделять часть данных в структуры, имеющие свой интерфейс, использовать перегрузку операторов и перечисляемые типы, спецификаторы const, mutable и т.п.
На худой конец - использовать возможности стат.анализаторов.
В любом случае - от ошибки никто не застрахован


Часовой пояс GMT +4, время: 21:30.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot