Возврат указателя из функции-члена С++

77
9

Если я хочу вернуть указатель из функции-члена, я сначала подумал, что синтаксис должен выглядеть следующим образом:

 char SecondClass:: *getName() {
return this->name;
}

Но у меня появилось сообщение об ошибке в Eclipse, что оно не может решить поле "имя". Каким-то образом он становится скрытым в этом случае.

Правильное решение - это

 char *SecondClass:: getName() {
return this->name;
}

Это помещает * перед именем класса вместо имени функции.

Поэтому мой вопрос: почему первая функция не работает и какова разница между этими реализациями возвращающих указателей от функций-членов?

спросил(а) 2021-01-25T19:30:05+03:00 4 месяца, 3 недели назад
1
Решение
124

Это не имеет никакого отношения к указателям. Метод называется SecondClass::getName() и он возвращает char *. Таким образом, вы можете написать

char* SecondClass::getName()

или

char *SecondClass::getName()

но вы не можете поместить * между именем класса и именем метода.

ответил(а) 2021-01-25T19:30:05+03:00 4 месяца, 3 недели назад
63

char SecondClass:: *getName() - очень отличная функция от char *SecondClass:: getName().

Первые из них не является функция члена SecondClass или любого другого класса, таким образом, вы не можете ссылаться на this в нем. Возвращается специальный указатель, называемый указателем на член. Его тип char SecondClass:: * и является указателем на элемент типа char в классе SecondClass. Вероятно, вы еще не хотите знать об этом.

Необходимый ssyntax - это имя-имя-функция-имя-имя-параметра. Вы хотите определить функцию с именем SecondClass::getName которая возвращает char * и не принимает никаких параметров, поэтому char *SecondClass::getName().

ответил(а) 2021-01-25T19:30:05+03:00 4 месяца, 3 недели назад
44

В c++ сигнатурой функции-члена является [returnType] [ClassName] :: functionName {}

звезда является частью возвращаемого типа, который является char *, или указателем на символ. Ваш первый способ объявления функции просто недействителен c++.

ответил(а) 2021-01-25T19:30:05+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема