Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Статические члены и наследование 
:(
    Опции темы
W4FhLF
Дата 29.8.2008, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



vinter, так весь смысл в том, что доступ через интерфейс контролируемый при любой операции, связанной с внутренним состоянием объекта. Это не нарушение(если не впадать в абсолютизм). 

Геттеры/сеттеры инкапсулируют внутреннюю структуру объекта и позволяют осуществить контроль доступа, т.е. инкапсулируют правила по которым доступ должен быть осуществлён(проверка границ, типа, размеров etc.)

Это сообщение отредактировал(а) W4FhLF - 29.8.2008, 09:42


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
vinter
Дата 29.8.2008, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(W4FhLF @  29.8.2008,  10:39 Найти цитируемый пост)
позволяют осуществить контроль доступа, т.е. инкапсулируют правила по которым доступ должен быть осуществлён(проверка границ, типа, размеров etc.)

с этой частью я согласен. Ты видимо меня не понял, я говорил о внутренней перменной, для которой есть гет\сет просто как return\=, т.е это то же самое, что паблик, но типо скрыто за интерфейс. Я говорил об этом.


--------------------
Мой блог
PM MAIL WWW   Вверх
Alek86
Дата 29.8.2008, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(vinter @  29.8.2008,  08:53 Найти цитируемый пост)
ты открыл доступ к внутреннему состоянию, интерфейс\напрямую не важно, важно то, что пользователь получает доступ. А это нарушение.

если это внутреннее состояние, то геты и сеты должны отсутствовать
если же это типа шарпового Свойства, то геты и сеты пишутся только так. и ничего не нарушают.

поскольку через год реализация этого класс может так поменяться, что и переменной, скрывающейся за гетом и сетом, уже не будет.

Цитата(vinter @  28.8.2008,  19:21 Найти цитируемый пост)
За что люблю Сишников, вооружатся стандартом  и умными книжками и с рвением святой инквизиции доказывают всем мнение чужого дядьки  

кроме "мнения чужого дядьки" есть еще собственный опыт мучения при рефакторинге кода, отладке, обнаружении багов...


--------------------
user posted image    user posted image
PM MAIL   Вверх
vinter
Дата 29.8.2008, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(Alek86 @  29.8.2008,  11:02 Найти цитируемый пост)
если же это типа шарпового Свойства, то геты и сеты пишутся только так. и ничего не нарушают.

а я говорю нарушают, и кто прав?

Цитата(Alek86 @  29.8.2008,  11:02 Найти цитируемый пост)
поскольку через год реализация этого класс может так поменяться, что и переменной, скрывающейся за гетом и сетом, уже не будет.

и что? паблик переменная точно так же пропадет, разница в чем?


--------------------
Мой блог
PM MAIL WWW   Вверх
W4FhLF
Дата 29.8.2008, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата(Alek86 @  29.8.2008,  10:02 Найти цитируемый пост)
если это внутреннее состояние, то геты и сеты должны отсутствовать


Т.е.? Что такое по-твоему внутреннее состояние? Ну допстим свойство visible объекта характеризует его внутреннее состояние. Почему геты и сеты здесь должны отсутсововать?


Цитата(vinter @  29.8.2008,  09:56 Найти цитируемый пост)
т.е это то же самое, что паблик, но типо скрыто за интерфейс. Я говорил об этом.


Ты ещё сказал, что паблик переменные маст хэв когда они нужны. А когда они нужны-то? 

Кроме случаев с простейшими структурами-классами типа:

Код

struct Point
{
public:
    Point() {};
    Point(unsigned nx, unsigned ny):
      x(nx), y(ny)
    {};

    unsigned x;
    unsigned y;

};


Ничего придумать не могу.





--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Anton Vatchenko
Дата 29.8.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



Подождите, кто сказал что мой код под винду? Он под линуксом работает, вот только хочу узнать как сделать, чтобы работал правильно...


--------------------
user posted image
PM MAIL   Вверх
Alek86
Дата 29.8.2008, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(vinter @  29.8.2008,  10:20 Найти цитируемый пост)
а я говорю нарушают, и кто прав?

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

к примеру есть класс Квадрат
Код
class Square {
public:
 size_t Side() const { return m_side; }
 void Side(side_t side) { m_side = side; }
private:
 size_t m_side;
};

ты, конечно же, сделаешь просто структуру
Код
struct Square {
 size_t m_side;
};


потом окажется, что у этого класса(структуры) нужно часто использовать размер для подсчета площади. при том, что размеры квадратов меняются не так часто.
я, для оптимизации, напишу так
Код
class Square {
public:
 size_t Side() const { return m_side; }
 void Side(side_t side) { m_side = side; m_surface_area = m_side * m_side;}
 size_t SurfaceArea() const { return m_surface_area; }
private:
 size_t m_side;
 size_t m_surface_area;
};

что сделаешь ты?

Это сообщение отредактировал(а) Alek86 - 29.8.2008, 10:38


--------------------
user posted image    user posted image
PM MAIL   Вверх
W4FhLF
Дата 29.8.2008, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Anton Vatchenko, тестовый пример, на котором ты измерял скорость, под винду. А как сделать правильно тебе уже показали. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Alek86
Дата 29.8.2008, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(Anton Vatchenko @  29.8.2008,  10:27 Найти цитируемый пост)
Он под линуксом работает, вот только хочу узнать как сделать, чтобы работал правильно...

я тебе привел самое оптимальное решение
честно говоря, как сделать нормально без виртуальных функций не представляю.


--------------------
user posted image    user posted image
PM MAIL   Вверх
vinter
Дата 29.8.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(W4FhLF @  29.8.2008,  11:21 Найти цитируемый пост)
А когда они нужны-то? 

не могу сходу пример привести, просто я не отметаю их использование совсем, т.е если надо, значит надо.
Глупый конечно пример, НО Синглтон.
Цитата(Anton Vatchenko @  29.8.2008,  11:27 Найти цитируемый пост)
Подождите, кто сказал что мой код под винду? Он под линуксом работает, вот только хочу узнать как сделать, чтобы работал правильно...

разницы нет, в Винде С++ ничем не отличается smile

Добавлено через 3 минуты и 41 секунду
Alek86, я сделаю через КЭШ, Get для площади кеширует вычисление, т.е не вычисляет, если уже вычислен. Хотя конкретно в данном примере это роли не играет.
Set это Set, почему в Set происходит вычисление сторонней переменной? это не гут.


--------------------
Мой блог
PM MAIL WWW   Вверх
Alek86
Дата 29.8.2008, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(vinter @  29.8.2008,  10:36 Найти цитируемый пост)
Глупый конечно пример, НО Синглтон.

обычно его реализуют с помощью статичесткой ф-ии GetInstance()...


кстати, как во всяком правиле, тут (неиспользование паблик переменных) есть исключения
и в приведенной задаче в книге Саттера они описываются.
и их процент очень мал (думаю, меньше одного)


--------------------
user posted image    user posted image
PM MAIL   Вверх
vinter
Дата 29.8.2008, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(Alek86 @  29.8.2008,  11:41 Найти цитируемый пост)
обычно его реализуют с помощью статичесткой ф-ии GetInstance()...

я имел ввиду данные которые Синглтон хранит, а не экземпляр


--------------------
Мой блог
PM MAIL WWW   Вверх
Alek86
Дата 29.8.2008, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(vinter @  29.8.2008,  10:36 Найти цитируемый пост)
Set это Set, почему в Set происходит вычисление сторонней переменной? это не гут.

set - это set для юзера
а прогер может писать там все, что посчитает нужным для ускорения или упрощения вида класса
там может со временем вообще 10 переменных меняться (если того потребуют обстоятельства).
в этом и заключается вся прелесть инкапсуляции + отделения интерфейса от реализации класса

Цитата(vinter @  29.8.2008,  10:36 Найти цитируемый пост)
Alek86, я сделаю через КЭШ, Get для площади кеширует вычисление, т.е не вычисляет, если уже вычислен. Хотя конкретно в данном примере это роли не играет.

можно в коде? вроде его не так уж и много

Добавлено через 1 минуту и 18 секунд
Цитата(vinter @  29.8.2008,  10:44 Найти цитируемый пост)
я имел ввиду данные которые Синглтон хранит, а не экземпляр

тоже не совсем понял...
синглтон в GetInstance возвращает ссылку(указатель) на экземпляр класса
какие там данные публичные?


--------------------
user posted image    user posted image
PM MAIL   Вверх
vinter
Дата 29.8.2008, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Код

class Square {
public:
 size_t Side() const { return m_side; }
 void Side(side_t side) 
 {
      m_side = side; 
      m_bSurCache = false;
 }
 size_t SurfaceArea() const 
{ 
    if( !m_bSurCache )
   {
       m_surface_area = m_side * m_side;
       m_bSurCache = true;
    }
    return m_surface_area;
 }
private:
 size_t m_side;
 size_t m_surface_area;
 bool m_bSurCache;
};

Цитата(Alek86 @  29.8.2008,  11:48 Найти цитируемый пост)
синглтон в GetInstance возвращает ссылку(указатель) на экземпляр классакакие там данные публичные?

Singleton можно использовать как глобальное хранилище параметров, вот там много паблик переменных.
Цитата(Alek86 @  29.8.2008,  11:48 Найти цитируемый пост)
set - это set для юзераа прогер может писать там все, что посчитает нужным для ускорения или упрощения вида класса

согласен, но толлько если там простейшие операции, если идут математические вычисление, то это не гут. Пользователь делает Set, он не просит вычилить площадь, она ему может никогда не понадобиться.



--------------------
Мой блог
PM MAIL WWW   Вверх
Alek86
Дата 29.8.2008, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



vinter, а теперь посморти на свой код и мой

если программист А использует мой код, а программист Б - твой, то у какого программиста будет меньше всего проблем при изменении класса Square (или структуры на класс)?

Добавлено через 36 секунд
придирка
bool m_bSurCache; должен быть mutable


--------------------
user posted image    user posted image
PM MAIL   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.7076 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.