crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> ещё одна загадка )
Алексей1153
  опции профиля:
сообщение 10.12.2012, 15:00
Сообщение #1


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


CONSTref - константный указатель на контейнер. Стало быть содержимое контейнера тоже должно быть недоступно для изменения через эту ссылку. Но:


        typedef std::map<int,int*> td_map;
        td_map m;
        m[0]=new int(7);

        const td_map& CONSTref=m;



        int* pointer1=CONSTref[0];        //ругается, как и должно быть


        int* pointer2=CONSTref.begin()->second;        //фокус: прокатывает :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 10.12.2012, 16:26
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


совершенно верно. потому что мап твой объявлен без константы. если бы был
typedef std::map<int,const int*> td_map;
- тогда он бы ругался.
а сам объект не меняется. вот, например, insert тут уже не проканает. а изменение элементов - без проблем.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 11.12.2012, 19:00
Сообщение #3


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


дело как раз в том, что мне там не нужно делать константу ))
Но мне это ничем не мешает, просто странно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 11.12.2012, 20:49
Сообщение #4


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


да нет в этом ничего странного. всё строго по определениям, которые ты сам задал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 12.12.2012, 14:27
Сообщение #5


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


погоди-погоди. Смотри, есть константная ссылка на объект. Это означает, что, не прибегая к явному приведению, мы не можем менять содержимое объекта, вызывает не-const функции, так ?

и с оператором [] это ожидаемо правильно.
А вот оператор -> позволил получить неконстантный указатель на элемент объекта.

Вот это и смущает
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 12.12.2012, 15:27
Сообщение #6


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


а содержимое объекта и не меняется. твой объект - мап. ты получил элемент-указатель. при манипуляциях с этим указателем сам он никак не меняется, меняется значение по адресу, на который он указывает. а это к твоему объекту никак не относится.
если ты хочешь защиты каких-то дополнительных данных, явно не принадлежащих объекту, то тебе надо писать класс и явно определять методы доступа, с указанием const для тех, которые ты считаешь не изменяющими объект манипуляциями.

Сообщение отредактировал Iron Bug - 12.12.2012, 15:34
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 12.12.2012, 16:32
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 17.2.2010
Из: Москва
Пользователь №: 1470

Спасибо сказали: 30 раз(а)




Репутация:   3  


Цитата(Алексей1153 @ 10.12.2012, 16:00) *
CONSTref - константный указатель на контейнер. Стало быть содержимое контейнера тоже должно быть недоступно для изменения через эту ссылку. Но:


        typedef std::map<int,int*> td_map;
        td_map m;
        m[0]=new int(7);

        const td_map& CONSTref=m;



        int* pointer1=CONSTref[0];        //ругается, как и должно быть


        int* pointer2=CONSTref.begin()->second;        //фокус: прокатывает :)


Все правильно, сам second является частью td_map и его нельзя изменить, а указывает он на значение типа int, которое не является частью td_map, и его можно менять сколько душе угодно.
Можно даже вызывать у такого объекта не константные методы, если вместо указателя на int хранить указатель на объект какого-либо класса.
А вот, если объекты не должны изменятся через map, то хранить нужно константные указатели на них.

typedef std::map<int,const int*> td_map;


но об этом уже писали.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 12.12.2012, 17:04
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Цитата(ssoft @ 12.12.2012, 17:32) *
..... константные указатели на них

Я бы тут позанудствовал: аккуратнее с терминологией! Это не константный указатель, а - неконстантный указатель на константный объект. Нет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 12.12.2012, 18:03
Сообщение #9


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Влад @ 12.12.2012, 20:04) *
Цитата(ssoft @ 12.12.2012, 17:32) *
..... константные указатели на них

Я бы тут позанудствовал: аккуратнее с терминологией! Это не константный указатель, а - неконстантный указатель на константный объект. Нет?

да. это именно так. люди часто про это забывают.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 13.12.2012, 8:14
Сообщение #10


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 17.2.2010
Из: Москва
Пользователь №: 1470

Спасибо сказали: 30 раз(а)




Репутация:   3  


Цитата(Влад @ 12.12.2012, 18:04) *
Я бы тут позанудствовал: аккуратнее с терминологией! Это не константный указатель, а - неконстантный указатель на константный объект. Нет?


Да, подловили с терминологией :D
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 6:25