![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| mr_kaspersky |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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. В чем тут ошибка ? С нетерпением жду ваших советов. |
|||
|
||||
| Greeen |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 710 Регистрация: 13.8.2006 Где: Петербург Репутация: 7 Всего: 18 |
Извините конечно, но вы уверены, что занимались языком C++?
В C++ по умолчанию члены класса имеют доступ private. Добавлено через 1 минуту и 39 секунд В вашем примере конструктор класса, метод inc() и переменная m_count являются закрытыми. О чем вам компилятор, кстати, очень доходчиво говорит. -------------------- Подпись больше не нужна |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Greeen абсолютно прав, а автору топика совсем не вериться по части опыта.
|
|||
|
||||
| bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
|
||||
|
|||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
За двенадцать то лет, можно было бы выработать рефлекс писать ++m_count -------------------- 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 |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: -1 Всего: 1 |
а какая в данном случае разница? -------------------- undefined |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
ребят, надо быть проще, над вами тут кажется немного постебались, а вы повелись))
Добавлено через 1 минуту и 29 секунд для типа инт никакой, а для итераторов есть |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: -1 Всего: 1 |
ну и чем плох такой стиль, если понимать, что происходит.. как в данном случае, нарасчивать обычный счетчик? Это сообщение отредактировал(а) fish9370 - 18.11.2007, 01:17 -------------------- undefined |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
как раз если в этом случае использовать префиксный инкремент - это говорит о том, что человек как минимум понимает, чем он (инкремент) отличается от постфиксного + в общем случае префиксный инкремент эффективнее -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
написано ж: ++m_count представь, что потом когда-то поменяется тут тип инт на твой итератор. пусть лучше уж сразу будет "правильный" код, чтоб менять как можно меньше |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: -1 Всего: 1 |
там запятая была пропущена, см. поправку.. я все-таки не могу себе представить, чтобы изначально задуманный счетчик, вдруг, с фонаря, кто-то решил делать итератором.. 2 MAKCim: можно объяснить мне, в чем выражается эффективность? (при условии, что нам нужно нарасчивать счетчик) Это сообщение отредактировал(а) fish9370 - 18.11.2007, 01:22 -------------------- undefined |
|||
|
||||
| DjoNIK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 28.9.2006 Где: Питер/Георгиевск Репутация: 4 Всего: 5 |
итератором можно использовать как "счетчик адреса" (если чуж очень грубо говоря) Как минимум в том, что при префиксной инкриментации не создается никаких временных объектов, а при постфиксной - создается -------------------- - Плесни-ка мне холодного кипятку. - Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды? - Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку. (разговор петербуржца и москвича) |
|||
|
||||
| fish9370 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: -1 Всего: 1 |
нет про счетчик адреса - это высосанно из пальца.. тут ясно идет речь о обычном счетчике, который обычно именуют count (или counter).. счетчик, например, в котором учитывается количество посетителей на сайте или число кликов.. или число проданых товаров..
а можно мне это продемонстрировать, как это выглядит на АСМе? Это сообщение отредактировал(а) fish9370 - 18.11.2007, 01:45 -------------------- undefined |
||||
|
|||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Тут не нужен асм, а важна семантика С++ в отношении пре/пост-фиксного инкремента. В стандарте явно прописано, что и когда произходит. Понятно, что компилятор умный и всё оптимизирует и не будет создавать временный объект. Но зачем до этого доводить? Тем более, как уже сказали выше, в будущем меньше придется изменять при использовании другого более "тяжелого" типа. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |