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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неожиданные особенности инкапсуляции 
V
    Опции темы
fish9370
Дата 18.11.2007, 02:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

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



Цитата(Daevaorn @ 18.11.2007,  01:58)
Цитата(fish9370 @  18.11.2007,  02:44 Найти цитируемый пост)
а можно мне это продемонстрировать, как это выглядит на АСМе?

Тут не нужен асм, а важна семантика С++ в отношении пре/пост-фиксного инкремента. В стандарте явно прописано, что и когда произходит. Понятно, что компилятор умный и всё оптимизирует и не будет создавать временный объект. Но зачем до этого доводить? Тем более, как уже сказали выше, в будущем меньше придется изменять при использовании другого более "тяжелого" типа.

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

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


--------------------
undefined
PM MAIL WWW ICQ   Вверх
JackYF
Дата 18.11.2007, 03:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(fish9370 @  18.11.2007,  02:23 Найти цитируемый пост)
в будущем ничего менять не придется, еще раз повторяю,

 smile это поначалу так думается. После второй-третьей перекройки исходника вдоль и поперёк начинаешь осознавать обратное smile

Программа пишется не один раз. А хорошая программа - далеко не один раз.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
fish9370
Дата 18.11.2007, 04:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

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



Цитата(JackYF @  18.11.2007,  03:16 Найти цитируемый пост)
это поначалу так думается. После второй-третьей перекройки исходника вдоль и поперёк начинаешь осознавать обратное 


ну если это так, то никого не смущает, тот факт, что придется менять переменную m_count на нечто вроде iterator? всех только волнует, что нужно менять m_count++ на ++m_count? и то спорно, примеров пока так никто и не привел.. кто-то "блеснул стилем" и понеслась это круто, а это не круто.. только доказательства какие-то неубедительные..

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

Добавлено @ 04:14
и еще мне нравится забота о компиляторе, несчастненьком, давайте будем все делать за него.. ему молоко за вредность давать нужно.. 

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

Это сообщение отредактировал(а) fish9370 - 18.11.2007, 04:23


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Dims
Дата 18.11.2007, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(mr_kaspersky @  16.11.2007,  20:37 Найти цитируемый пост)
Недавно я обратил внимание, что (например в устной речи) часто используется
слово "класс", и, как я понял по контексту, это ничто иное как struct.


Это не совсем верно. В структуре все члены по умолчанию публичные. Чтобы их сделать приватными, нужно это явно указать. А в классе, наоборот, все члены по умолчанию приватные. Чтобы они были публичными, нужно это специально указать.

А больше, действительно, отличий нет.

В Вашем случае, чтобы работало, надо написать:

Код

class S1
{

public:

    /** Default constructor */
    S1() { m_count = 0;}
    
    /** Increase internal variable */    
    void inc() {m_count++;}     
    
    int m_count; /**< Counter  */
};


Здесь метка public: делает всё нижеследующего публичным, как в структуре.

Собственно, без public/private инкапсуляция, как идея, становится неполной. По правилам инкапсулирования, Вы должны пометить private всё то, чем "не положено" пользоваться извне. В результате класс станет "чёрным ящиком", пользоваться которым можно только через небольшое число public членов. Залезть в "чёрный ящик" в обход предусмотренного нельзя, это его private зона.

Добавлено @ 07:10
Цитата(fish9370 @  17.11.2007,  22:27 Найти цитируемый пост)
а какая в данном случае разница? 

Мне тоже кажется, что никакой. Но я сам помню, действительно, что начиная с какого-то времени мне стало нравиться использовать префиксную форму. Правда, только в цикле for, а в данном случае я бы тоже написал постфиксно.

Добавлено @ 07:18
Цитата(Daevaorn @  16.11.2007,  20:55 Найти цитируемый пост)
а автору топика совсем не вериться по части опыта. 

Наоборот! В 12 как раз верится. Вот в 5 я бы не поверил. А 12 лет назад у нас не было даже компьютерных факультетов, а, может, и компьютеров (я уже забыл). Все учились самоучками, а самоучка отличается тем, что в его навыках всегда присутствуют вот такие вот "странности". Вполне можно поверить, что он 12 лет успешно использовал struct в крупных проектах.


Это сообщение отредактировал(а) Dims - 18.11.2007, 07:19
PM MAIL   Вверх
Ln78
Дата 18.11.2007, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



 smile 
Dims (и не только), неужели Вы всерьёз полагаете, что человек с таким ником, знающий слово инкапсуляция, не в состоянии разобраться в вопросе, который он задал? Не стоит воспринимать всё так уж буквально. smile  И кстати, непонятно, как я ухитрился примерно 2 раза по 12 лет назад поступить на компьютерный факультет, когда их ещё не было?  ВМиК МГУ появился в 1970г, хотя в "моё время" С++ не изучали.
PM MAIL   Вверх
archimed7592
Дата 18.11.2007, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

Репутация: 58
Всего: 93



Нафлудили то сколько... 0_о

fish9370, тут дело больше не в "понимаю что происходит"/"не понимаю"/"заменю на итератор"/"не заменю", а в рефлексе.
Если ты всегда используешь пре*кремент, и только когда нужно(реально нужно), пост*кремент, то никогда у тебя никаких проблем не возникнет smile.
Это тоже самое, что рефлекс писать const, писать explicit у конструкторов и подобные мелочи от которых "разницы" нет.

Добавлено через 3 минуты и 43 секунды
Цитата(Dims @  18.11.2007,  07:05 Найти цитируемый пост)
Вполне можно поверить, что он 12 лет успешно использовал struct в крупных проектах.

Ага, и жил в заповеднике, где наглые обезьяны и носороги скрывали от него существование class smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 18.11.2007, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(fish9370 @  18.11.2007,  01:44 Найти цитируемый пост)
а можно мне это продемонстрировать, как это выглядит на АСМе?

Код

int i = 0;
i++;

Код

...
mov dword [ebp - 4], 0
mov eax, dword [ebp - 4]
push eax ; создание временной переменной
inc eax
mov dword [ebp - 4], eax
pop eax
...

Код

int i = 0;
++i;

Код

...
mov dword [ebp - 4], 0
inc dword [ebp - 4]
...

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

Добавлено @ 11:17
Цитата(fish9370 @  18.11.2007,  04:09 Найти цитируемый пост)
и еще мне нравится забота о компиляторе, несчастненьком, давайте будем все делать за него.. ему молоко за вредность давать нужно.. 
если код выглядит логичнее, то так оно и лучше.. а на проблемы компилятора мне начхать!!

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

Это сообщение отредактировал(а) MAKCim - 18.11.2007, 11:37


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 18.11.2007, 13:42 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

Репутация: 58
Всего: 93



Насчёт заботы о компиляторе:
c-cast vs c++-cast
void * vs T *
assignment vs constructor
уже упомянутое T vs const T
int vs enumeration
manual resource managment vs RAII
exception unsafety vs exception safety
Список можно долго продолжать.
Несмотря на то, что, по сути, для "X vs Y" результат будет одинаковым как при использовании X, так и Y, то что во втором "столбце" должно быть как минимум привычкой, а по хорошему - рефлексами, а при использовании конструкций из первого "столбца" внутри должен срабатывать громогласный alarm.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
fish9370
Дата 18.11.2007, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

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



приму к сведению..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
JackYF
Дата 18.11.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(archimed7592 @  18.11.2007,  13:42 Найти цитируемый пост)
c-cast vs c++-cast
void * vs T *
assignment vs constructor
уже упомянутое T vs const T
int vs enumeration
manual resource managment vs RAII
exception unsafety vs exception safety

ППКС.

Не всегда удаётся полностью это сделать, но всегда, имхо, надо стараться и уж никак не ратовать за "компилятор умный, он сам всё за меня сделает". Это не оправдание плохого стиля.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 18.11.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

Репутация: 58
Всего: 93



Цитата(JackYF @  18.11.2007,  17:47 Найти цитируемый пост)
Не всегда удаётся полностью это сделать,

0_o.
Я понимаю, что не всегда удаётся выдерживать стиль полностью, но, тот короткий список, что я привёл - IMHO, может "не всегда удаваться" только в случае жесткого(очень жесткого) навязывания этого какими-либо внешними факторами, на которые ты никак не можешь повлиять(габаритная, криво спроектированная библиотека, написание wrapper'а к которой - большая потеря времени; начальство, навязывающее некоторый стиль, не соответствующий твоему идеалу и т.п.), но, даже в таких случаях такие места очень просто локализовать, т.о. исключив распространения плохого стиля повсеместно в коде...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
UnrealMan
Дата 19.11.2007, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 27
Всего: 32



Цитата(archimed7592 @  18.11.2007,  13:42 Найти цитируемый пост)
то что во втором "столбце" должно быть как минимум привычкой, а по хорошему - рефлексами

Только не в отношении

Цитата(archimed7592 @  18.11.2007,  13:42 Найти цитируемый пост)
c-cast vs c++-cast
T vs const T

А это

Цитата(archimed7592 @  18.11.2007,  13:42 Найти цитируемый пост)
int vs enumeration

вообще непонятно что такое.

Это сообщение отредактировал(а) UnrealMan - 19.11.2007, 02:38
PM MAIL   Вверх
archimed7592
Дата 19.11.2007, 04:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

Репутация: 58
Всего: 93



Цитата(UnrealMan @  19.11.2007,  02:21 Найти цитируемый пост)
Только не в отношении

Почему?
Где хороши c-cast'ы?
Чем хорошо не делать переменную константной, если ей незачем меняться?

Цитата(UnrealMan @  19.11.2007,  02:21 Найти цитируемый пост)
вообще непонятно что такое.

Код

const int MY_ENUM_RED = 0;
const int MY_ENUM_GREEN = 1;
const int MY_ENUM_BLUE = 2;

...

void A::changeColor(int color)
{ ... }
...
a.changeColor(MY_ENUM_RED);

vs
Код

enum Color { red, green, blue };
...
void A::changeColor(Color color)
{ ... }
...
a.changeColor(red);


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


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Dims
Дата 19.11.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Ln78 @  18.11.2007,  07:50 Найти цитируемый пост)
Dims (и не только), неужели Вы всерьёз полагаете, что человек с таким ником, знающий слово инкапсуляция, не в состоянии разобраться в вопросе, который он задал?

Конечно, вероятность шутки велика. Но точно мы знать этого не можем. Кроме того, если это шутка, то тоже странная. Не очень смешная.

PM MAIL   Вверх
UnrealMan
Дата 19.11.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 27
Всего: 32



Цитата(archimed7592 @  19.11.2007,  04:32 Найти цитируемый пост)
Где хороши c-cast'ы?

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

int x, y;
....
double result = (double)x/y;

static_cast здесь не имеет никаких преимуществ. Наоборот, поскольку он занимает гораздо больше места, его присутствие только ухудшит читаемость кода. Приведение в функциональной нотации (которое всё-таки относится к C++-cast) - это почти то же самое, что C-cast.

Цитата(archimed7592 @  19.11.2007,  04:32 Найти цитируемый пост)
Чем хорошо не делать переменную константной, если ей незачем меняться?

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

Цитата(archimed7592 @  19.11.2007,  04:32 Найти цитируемый пост)
Пример с цветами конечно неудачный

Неудачное - это название сравнения "int vs enumeration".
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.0629 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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