![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
Добрый день.
Можно ли сделать/объявить действительно константную ссылку? т.е. я сейчас делаю так: const std::vector<int>& SomeFunction(); и, соответственно: const std::vector<int>& data = SomeFunction(); но компилятор пропускает data.clear(); этого можно как-то избежать? Заранее благодарю за ответ. -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Fire-Plug |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
Спецификатор const в обьявлении обьекта(переменной, ссылки, указателя) указывает компилятору, что изменять состояние обьекта нельзя (т.е. его следует рассматривать как read-only)
Если вектор действительно нужно очистить, ссылку следует обьявить как
--------------------
Объясни другому - поймешь сам (Народная примета) |
|||
|
||||
| Fire-Plug |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
О, блин, сорри - показалось "компилятор НЕ пропускает...." Надо думать... --------------------
Объясни другому - поймешь сам (Народная примета) |
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
А если ссылку на константный обьект попробовать?
--------------------
|
|||
|
||||
| Fire-Plug |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
Каким компилятором ты пользуешься?
VC6 и выше вызов clear() для констатной ссылки на объект не пропускает, сообщая при этом, что не может конвертнуть this-указатель констатного объекта в неконстантный
--------------------
Объясни другому - поймешь сам (Народная примета) |
|||
|
||||
| srd |
|
||||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Ты где то ошибся.
Пытаюсь скомпилировать следующий код:
Получаю ошибку:
Так что константная ссылка действительно константна. -------------------- Не смей читать мою подпись!!! |
||||
|
|||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
ИМХО, вопрос реализации и версии STL. На других платформах может быть иначе. |
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
_hunter, а ты случаем Borland'овский компилер юзаешь? Я слышал, у него бывают заскоки по фазе...
Вообще я согласен с DENNN'ом --------------------
|
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
ССылка то константна, но вот получить по этой ссылке доступ к методам класса ты можешь - > нет никакой гарантии что вызванный метод не изменит свои внутренние данные. |
|||
|
||||
| chipset |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Если я не ошибаюсь, методу константного обьекта класса передается константный this и компилер плюется при попытке изменить данные. --------------------
|
||||
|
|||||
| srd |
|
||||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Для константного объекта данные-члены доступны только на чтение, а из функций-членов доступны только опять-таки константные (т.е. определённые с модификатором const) и статические. Из константных методов менять можно только статические поля и поля со спецификатором mutable, а из статических методов - только статические поля. Так-что гарантия есть.
Не может. Если реализация STL соответствует стандарту, то в ней метод clear() вектора не имеет модификатора const, а значит этот метод не может быть вызван для константных объектов. -------------------- Не смей читать мою подпись!!! |
||||
|
|||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
стандарт языка с++ (наверное любой номер) говорит о том, что
А зачем возвращать const ссылку если пользователь твоей функции её только смотрит? Может имеет смысл вернуть копию объекта? Или это экономия памяти? Это сообщение отредактировал(а) np9mi7 - 8.4.2005, 14:58 |
|||
|
||||
| chipset |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Я ж и говорю, билдерь наверное.. Сейчас придет _Хантер и расскажет --------------------
|
||||
|
|||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
сорри что так поздно пришел...
действительно пишу под билдером ( если это его прикол -- обидно np9mi7, не столько памяти сколько времени ( у меня этих чтений -- туева хуча ) полный код ( чтобы не было вопросов ):
и единственное, что мне на это говорит компилятор: [C++ Warning] W8037 Non-const function _STL::vector<int,_STL::allocator<int> >::clear() called for const object и все -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Значит билдерь пропускает константные вызовы, из еррора превращая их в ворнинги.
--------------------
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
ясно... (и обидно
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
ну, так не меняй его? и warnings не будет!
ну как вы не понимаете, Builder с++ это чтоб на форму кнопки кидать, на нем мего надежных приложений не пишут! там и vcl только для этого.... Это сообщение отредактировал(а) np9mi7 - 8.4.2005, 16:40 |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
я и не меняю. и проблема не в наличии предупрежедения при попытке изменения, а в отсутствии ошибки.
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Если хочешь - можешь попробовать обернуть вектор в враппер запрещающий использовать изменяющие функции, хотя это конечно жуткий гемморой..
--------------------
|
|||
|
||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Или ты в комманде, ну так на уровне бумаги напиши (если руководитель) что так писать нельзя. У меня есть такой документ: Стилистические соглашения, в которых я все такие вещи обговариваю, потом все члены комманды крепят напротив себя это липучкой и все... Это сообщение отредактировал(а) np9mi7 - 8.4.2005, 17:00 |
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
А ещё есть такая фича как "warning as error".
--------------------
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
так это только у меня будет...
а если я из модуля отдаю вектор в твердой уверенности что с ним ничего не сделают. а он пустым оказывается... ( это, пока, все на уровне теорий, но всеравно неприятно... ) -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Ну, при определении интерфейса к классу вообще плохой стиль давать внутренность! Возвращай копию и все!
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
да знаю, что плохой стиль, но тут уже проблема скорости появляется ( я выше писал )
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Давай считать.
Сколько примерно объектов в контейнере Какие операции хочешь совершать Подожди, какая проблема скорости? Че долго откопировать один контейнер в другой? Те беж нужно его только смотреть, тогда время будет тратиться только на копирование!!! Количество операций с сылкой или копией не измениться! Нет разве? Или я чего не понимаю? Это сообщение отредактировал(а) np9mi7 - 8.4.2005, 18:12 |
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
_hunter, хм, а с защищеными кучами или отображениями файла поиграть если?
--------------------
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
примерно 3600. да тех классов еще под сотню ( это пока все в планах -- тестирование ведется на 100 первых и 2-х вторых )
+ проблема в том, что к первым классам доступ случайным будет ( т.е. получить вначале все копии не получится ) -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| chipset |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Когда он передаст ссылку - скопируется 32 бита, когда скопирует массив - скопируется дофига_всего. Добавлено @ 18:17 _hunter, ну раз много классов - выделяй из кучи - ставь READ_ONLY. --------------------
|
||||
|
|||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
а что за защищенные кучи?
с файлами не получится -- нужно подумать... но, чувствую, структуру классов кардинально переделывать придется... -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| np9mi7 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
это понятно, но количество операций которые он совершит с константной ссылкой после передачи не чуть не больше чем с копией. Разница только на этапе копирования.
или ты хочешь сказать что тебе нужна ссылка на объект который должен меняться, а ты хочешь его постоянно смотреть по этой ссылке |
||||
|
|||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
С отображенными файлами вроде точно такое можно сделать..
Про кучи, только что глянул, что-то очень сомнительная HeapLock да и то от других процессов.. Будем дальше думать. --------------------
|
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Здесь показан пример использования отображения как разделяемой памяти.
--------------------
|
|||
|
||||
| Fire-Plug |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
Нехорошо это, внутренние переменные нетривиального содержания из класса наружу отдавать. Это же не совсем аналогично ситуации вида: size_t someclass:size() const; А как же инкапсуляция? Ежели какому-то классу-клиенту этот вектор нужен для принципиальных целей, то это должен быть его атрибут. И он будет передавать его по ссылке методу класса-хэлпера, к-рый знает, например, как этот вектор заполнить (ну, скажем, прочти чего-то из конфигурации, посчитай, найди и т.д. и т.п и положи в этот вектор). Если предложенная модель не годится, то иногда удобнее сдублировать часть интерфейса вектора в его классе-контейнере. Например,
Добавлено @ 08:41
Во, блин, как плохо читать постинги через один! chipset уже эту идею предложил... --------------------
Объясни другому - поймешь сам (Народная примета) |
||||||
|
|||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |