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

Поиск:

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


Новичок



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

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



Добрый день, уважаемые жители форума !

Недавно я столкнулся с новой для меня проблемой в разработке на C++, хотя занимаюсь этим
уже около двенадцати лет. За все это время я участвовал в нескольких крупных проектах с 
объектно-ориентированным уклоном и, надо сказать, непреодолимых трудностей не возникало.
До поры, до времени. 

Собственно проблема такова:

Я создаю некоторую сущность, наделяю ее некоторыми свойствами:

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

Затем, где S1 видна, я начинаю с ней общаться: 

...
S1 s1;
s1.inc();
std::cout  << s1.m_count << std::endl;
...

Недавно я обратил внимание, что (например в устной речи) часто используется
слово "класс", и, как я понял по контексту, это ничто иное как struct. Недавно я
с удивлением обнаружил зарезервированное слово class в синтаксисе языка.   
Да, вроде бы все хорошо, однако когда я меняю в определении S1
слово struct на слово class, я получаю ошибку компиляции ! Почему ?

Пробовал я на разных компиляторах, gcc, intel, borland, нигде не выходит.
Выдает сообщение об ошибке. Например, gcc говорит:
./example.cpp: In function 'int main()':
./example.cpp:7: error: 'S1::S1()' is private
./example.cpp:17: error: within this context
./example.cpp:10: error: 'void S1::inc()' is private
./example.cpp:18: error: within this context
./example.cpp:12: error: 'int S1::m_count' is private
./example.cpp:19: error: within this context
Причем здесь private ? Частный, личный или, наконец, персональный. Ну да, 
он действительно принадлежит S1. В чем  тут ошибка ?

С нетерпением жду ваших советов. 



PM MAIL   Вверх
Greeen
Дата 16.11.2007, 20:44 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Извините конечно, но вы уверены, что занимались языком C++?
В C++ по умолчанию члены класса имеют доступ private.

Добавлено через 1 минуту и 39 секунд
В вашем примере конструктор класса, метод inc() и переменная m_count являются закрытыми. О чем вам компилятор, кстати, очень доходчиво говорит.


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
Daevaorn
Дата 16.11.2007, 20:55 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Greeen абсолютно прав, а автору топика совсем не вериться по части опыта.
PM MAIL WWW   Вверх
bsa
Дата 16.11.2007, 23:21 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 63
Всего: 196



Код
class Object
{
       ...
};
тоже самое, что и
Код
struct Object
{
private:
       ...
};
Думаю, стоит почитать умную книжку по С++, дабы себя не компромитировать.
PM   Вверх
archimed7592
Дата 17.11.2007, 17:04 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(mr_kaspersky @  16.11.2007,  20:37 Найти цитируемый пост)
m_count++;

За двенадцать то лет, можно было бы выработать рефлекс писать ++m_count 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   Вверх
fish9370
Дата 17.11.2007, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(archimed7592 @ 17.11.2007,  17:04)
Цитата(mr_kaspersky @  16.11.2007,  20:37 Найти цитируемый пост)
m_count++;

За двенадцать то лет, можно было бы выработать рефлекс писать ++m_count smile.

а какая в данном случае разница?


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



ребят, надо быть проще, над вами тут кажется немного постебались, а вы повелись))

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

для типа инт никакой, а для итераторов есть
PM MAIL Skype GTalk   Вверх
Daevaorn
Дата 17.11.2007, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



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

никакой. но говорит о стиле.
PM MAIL WWW   Вверх
fish9370
Дата 17.11.2007, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

никакой. но говорит о стиле.

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

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


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


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


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

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



Цитата(fish9370 @  17.11.2007,  22:37 Найти цитируемый пост)
ну и чем плох такой стиль, если понимать, что происходит..  как в данном случае нарасчивать обычный счетчик? 

как раз если в этом случае использовать префиксный инкремент - это говорит о том, что человек как минимум понимает, чем он (инкремент) отличается от постфиксного + в общем случае префиксный инкремент эффективнее


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

PM MAIL   Вверх
Alek86
Дата 17.11.2007, 22:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(fish9370 @  17.11.2007,  22:37 Найти цитируемый пост)
как в данном случае нарасчивать обычный счетчик?

написано ж: ++m_count

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


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


Опытный
**


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

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



Цитата(Alek86 @ 17.11.2007,  22:55)
Цитата(fish9370 @  17.11.2007,  22:37 Найти цитируемый пост)
как в данном случае нарасчивать обычный счетчик?

написано ж: ++m_count

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


там запятая была пропущена, см. поправку..

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

2 MAKCim: можно объяснить мне, в чем выражается эффективность? (при условии, что нам нужно нарасчивать счетчик)

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


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


Опытный
**


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

Репутация: 4
Всего: 5



Цитата(fish9370 @  18.11.2007,  01:16 Найти цитируемый пост)
я все-таки не могу себе представить, чтобы изначально задуманный счетчик, вдруг, с фонаря, кто-то решил делать итератором

итератором можно использовать как "счетчик адреса" (если чуж очень грубо говоря)

Цитата(fish9370 @  18.11.2007,  01:16 Найти цитируемый пост)
в чем выражается эффективность?

Как минимум в том, что при префиксной инкриментации не создается никаких временных объектов, а при постфиксной - создается


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
fish9370
Дата 18.11.2007, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(DjoNIK @  18.11.2007,  01:33 Найти цитируемый пост)
итератором можно использовать как "счетчик адреса" (если чуж очень грубо говоря)


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



Цитата(DjoNIK @  18.11.2007,  01:33 Найти цитируемый пост)
Как минимум в том, что при префиксной инкриментации не создается никаких временных объектов, а при постфиксной - создается 


а можно мне это продемонстрировать, как это выглядит на АСМе?

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


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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



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

Тут не нужен асм, а важна семантика С++ в отношении пре/пост-фиксного инкремента. В стандарте явно прописано, что и когда произходит. Понятно, что компилятор умный и всё оптимизирует и не будет создавать временный объект. Но зачем до этого доводить? Тем более, как уже сказали выше, в будущем меньше придется изменять при использовании другого более "тяжелого" типа.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0907 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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