Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> const в параметре функции, а параметром является объект 
:(
    Опции темы
Royan
  Дата 8.4.2003, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Хехе только что писал вопрос, чтоб узнать в чем причина, а оказалось все просто, поэтому это не вопрос, а что-то типа типа полезного совета (просто жаль выкинуть столько напечатанного текста может кому пригодится) wink.gif
Итак. У меня следующий код:

Код

class Root{

private:
        int    myData;
        char *cellName;
...
};


Root *lastFound;

lastFound= new Root;
lastFound->Copy(*cellFound);//cellFound того же типа, что и lastFound то есть Root*

//Copy выгладит так - обратите внимание я передаю константную ссылку

void Root::Copy(const Base &copy){
       this->InitCellName(copy.GetCellName());//Ошибка - error C2662: 'GetCellName' : cannot convert 'this' pointer
                                                                       //from 'const class Base<double>' to 'class Base<double> &'
       (*this).myData=copy.GetMyData();         //Та же самая ошибка
}


Оказалось, что коли параметр константный, то через него нельзя вызывать не константную функцию!
Но здесь есть еще один момент который мне не понятен, если myData и cellName объявлены как protected или private разве к ним можно обращаться через операторы "." или "->" даже если сам copy является константной ссылкой?:

Код

void Root::Copy(const Base &copy){
       this->InitCellName(copy.cellName); //Вот как здесь
       (*this).myData=copy.myData;         //и здесь тоже
}

По пока не понятной мне причине у меня этот код прокатывает без ошибок....

Это сообщение отредактировал(а) Royan - 8.4.2003, 18:14


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Fantasist
Дата 8.4.2003, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
Но здесь есть еще один момент который мне не понятен, если myData и cellName объявлены как protected или private разве к ним можно обращаться через операторы "." или "->" даже если сам copy является константной ссылкой?:


protected и private с константностью никак ни связанны. Компилятор, в данном случае, лишь следит за тем, чтобы константый объект потенциально не мог измениться. Он же не знает, что твоя функция GetMyData() не меняет собственно объект, и раз она объявленна неконстантной, то вполне возможно, что и меняет. А когда ты обращаешься к переменной, то либо у тебя InitCellName принимает константный аргумент, либо компилятор не воспринимает изменения члена объекта как изменение самого объекта.
В твоем случае объявить GetCellName() и GetMyData() константными гораздо правильнее, нежели напрямую обращаться к защищенным переменным.

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


--------------------
Волны гасят ветер...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0405 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.