27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
|
||||||
1 | ||||||
string, c_str06.07.2012, 17:52. Показов 51621. Ответов 35
Метки нет (Все метки)
функция string.c_str() возвращает const char*, что бы не изменяли строку напрямую. Но! Если явно преобразовать указатель к char*, то строка вполне изменяется.
Угадайте что выведет. Так вот, собственно вопрос: зачем столько шумихи вокруг инкапсуляции, если даже в стринге ее легко обойти?
0
|
06.07.2012, 17:52 | |
Ответы с готовыми решениями:
35
Буффер из std::string c_str() Безопасность передачи string.c_str() в качестве параметра Не работает преобразование с c_str() X=atof(s.c_str()); - ошибка в Builder10 |
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
06.07.2012, 19:59 | 21 |
diagon, Специализация шаблонной функции объявленной в классе своим типом, все же не совсем внутри класса.
0
|
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
|
|
06.07.2012, 20:06 [ТС] | 22 |
Evg, ну то есть получается, что зря я храню характеристики персонажей в private?
Ведь проще напрямую взаимодействовать с переменными, чем через SetVal, GetVal
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
06.07.2012, 20:08 | 23 |
Ksan, Инкапсуляция. Я вам крайне советую почитать Герба Саттера. В коде, не относящемся к реализации класса (иерархии), используя его нормально (не используя хаки со специализациями и доступ к членам через смещение), вы можете использовать только public интерфейс класса, до private данных вам не дотянуться.
0
|
06.07.2012, 22:45 | 24 |
0
|
07.07.2012, 00:29 | 26 |
В маленьком проекте - проще. В большом проекте (особенно если над ним работает несколько человек) такой подход резко увеличивает вероятность того, что накосячишь на ровном месте, а потом концов не соберёшь. А потому лучше сразу приучать себя к тому, чтобы делать правильно
В функциях GetVal, SetVal ты всегда можешь поставить печать и быстренько посмотреть трассу изменения и чтения величины. Обращаясь к полю напрямую такого ты сделать не сможешь. Т.е. такой подход в том числе более удобен с точки зрения отладки
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
07.07.2012, 00:49 | 30 |
Avazart, Все удобно и все читаемо, свойства это исключительно синтаксический сахар в большинстве случаев.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
07.07.2012, 01:22 | 32 |
На тему использования инкапсуляции. Представьте что вы написали код, в котором используется класс с открытыми полями, вот вы предоставили ваш код клиентам, клиенты вовсю используют вашу библиотеку, используют открытые поля и тут поступает просьба от клиентов или же вы сами решаете расширить функционал вашей программы и пишете код, который добавляет/удаляет поля в структуру или же переносит их в приватную область видимости структуры и пишите методы, которые работают с данными как-то по особенному, в зависимости от конкретного ТЗ, вот вы провели тесты, все хорошо, выкатываете обновление, клиенты обновляются... И вы получаете сотни гневных писем, т.к. после вашего обновления весь код который писали клиенты библиотеки придется переписывать! А теперь представьте, что вы сразу сделали доступ к элементам через интерфейс, а не напрямую, скольких бы проблем удалось избежать?
2
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||||||
07.07.2012, 01:33 | 33 | |||||
Сообщение было отмечено как решение
Решение
вот поучительный код для любителей нарушать правила:
http://liveworkspace.org/code/... 5699a096fb
str1 = str str2 = str str1 = xtr str2 = xtr // как же так. ведь эту строку не меняли. Это происходит из-за того, что там std::string реализована с использованием оптимизации "копирование при записи". В восьмой студии строка без такой оптимизации сделана.
8
|
silent_1991
|
07.07.2012, 21:15
#34
|
Не по теме: DU, никогда не думал, что стандартный string copy-on-write реализует... В прошлом стандарте так же было?
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
07.07.2012, 21:43 | 35 |
не силен в стандарте, но там это вроде не оговаривается. можно с такой оптимизацией, а можно и без нее. посмотрел в 2012 студии. там тоже такой оптимизации нет, а она уже с новым стандартом.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
|
|||||||||||||||||||||||||||||||
07.07.2012, 21:48 | 36 | ||||||||||||||||||||||||||||||
я думаю что это происходит так
в старый не влазит выделяем новую память
старую удаляем НО.. значения в ней остались посему
и если выделить память еще раз и что то записать то вполне вероятно что p1 выведет не 12345 а что то другое а при
а просто переписываются значения в том же буфере
2
|
07.07.2012, 21:48 | |
07.07.2012, 21:48 | |
Помогаю со студенческими работами здесь
36
Очень медленное выполнение .c_str() в minGW Visual c++ input().c_str() вводит мусор реализация функции c_str() в моем классе Str c_str() или моя голова провалилась в пропасть Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |