Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > как обойти const?


Автор: KQT 1.11.2007, 07:13
Есть функция
Код

template<class T> Iterator<T>::Iterator(const List<T>& _l) {
    lcur = &_l;
}

На вторую строку выдает invalid conversion from `const List<int>*' to `List<int>*'. Как это можно обойти и получить указатель по константной ссылке?

Автор: archimed7592 1.11.2007, 07:37
Код

lcur = const_cast< List< T > * >(&l);


Добавлено через 3 минуты и 4 секунды
Только учти, что несмотря на то, что ты получил после этого неконстантный объект и, несмотря на то, что при попытке изменить такой объект(к примеру lcur->clear() ) компилятор не ругнётся на такую попытку, делать этого ты не имеешь права! После применения const_cast ты должен сам следить за соблюдением константности этого объекта.

Автор: chipset 1.11.2007, 08:18
И программа видимо работать будет очень, очень непредсказуемо. Обычно указатели расходятся по всему проекту (на то они и указатели) и поэтому добавление строки в одном модуле может по***ить тебе всю малину в другом. В общем если просто для исследовательских целей, юзай. А в команде такое писать нельзя.


Автор: archimed7592 1.11.2007, 08:48
chipset, такое можно писать, к примеру, когда уже есть код, который берёт некостантный указатель/ссылку, но в реальности не меняет сам объект(и ты это доподлинно знаешь) - к примеру как с win32api... Тогда можно без каких-либо угрызений совести сделать const_cast. Если же ты не уверен в этом(или вообще сам собираешься изменять объект), то только делать копию.

Автор: KQT 1.11.2007, 16:56
исчерпавающе. Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)