Const указатель в объектно-ориентированной ошибке класса - PullRequest
1 голос
/ 26 августа 2010

У меня есть простой пример ниже, который не компилируется.я получаю следующее предупреждение о const

Сообщение об ошибке: ошибка C2662: «Cfoo :: GetNum»: невозможно преобразовать указатель «this» из «const Cfoo» в «Cfoo &Преобразование теряет квалификаторы

class Cfoo 
{
    public:
        bool RunMe( const Cfoo * bar ) {
            int i = bar->GetNum() ; 
        }

        int GetNum() {
            return 7; 
        }
};   

int _tmain(int argc, _TCHAR* argv[])
{
    Cfoo a;

    Cfoo b;
    b.RunMe( &a); 

    return 0;
}

Сначала я подумал, что это связано с тем, что GetNum не возвращает константное значение.изменение, которое, казалось, не помогло.

Что я сделал не так ?, предложение, советы, примеры, ссылки?

Ответы [ 2 ]

9 голосов
/ 26 августа 2010

GetNum должен пообещать, что не изменит значение объекта, сделав его функцией-константой

class Cfoo 
{
    public:
        bool RunMe( const Cfoo * bar ) {
            int i = bar->GetNum() ; 
        }

        int GetNum() const { // !!!
            return 7; 
        }
};   
4 голосов
/ 26 августа 2010

Литб решение прямо на этом.

Тем не менее, я хотел бы сделать немного, чтобы уточнить, что на самом деле означает сообщение компилятора и как его расшифровать.

Итак, вот более подробное объяснение сообщения об ошибке и как его понять в этом контексте.Я надеюсь, что все гуру здесь исправят мое понимание.

"ошибка C2662: 'Cfoo :: GetNum': невозможно преобразовать этот 'указатель' из 'const Cfoo' в 'Cfoo &' Преобразование теряет квалификаторы"

  1. Тип 'bar' - 'Cfoo const *'.

Функция-член, такая как 'GetNum' в OP, - считается быть объявленным как

int Cfoo :: GetNum (Cfoo & dummyimpliedobjectparameter);// подразумеваемый объектный аргумент согласно 13.3.1/3 and /4

В соответствии с 13.3.1.1.1/2

Вызов функции bar->GetNum() обрабатывается как (*bar).GetNum(*bar), где (*bar) - этоimplied object argument

Теперь это означает, что объект типа 'Cfoo const' должен быть привязан к ссылке типа 'Cfoo &', чтобы сопоставить аргумент вызова функции с параметром функции.Согласно 8.5.3/5', это не разрешено, поскольку reference to non const не может связываться с const.

Так что, как предлагает Литб, способ выручить - сделать Cfoo::GetNum как constфункция-член.Согласно 13.3.1/3, с этим изменением функция-член Cfoo::GetNum теперь рассматривается как

int Cfoo::GetNum(Cfoo const &dummyimpliedobjectparameter); // note the const

Теперь функции-вызовы и параметры-члены точно совпадают икод правильно сформирован.

@ Стивен: теперь ошибка компиляции имеет больше смысла?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...