Элемент name
объявлен как объект string
, а не как указатель string*
на объект string
. Ваш метод getName()
объявлен как возвращающий указатель string*
, но он пытается использовать оператор *
, чтобы превратить объект name
в указатель, что не будет работать. std::string
не имеет такого реализованного operator*
, поэтому вы получаете ошибку компилятора. Но, что более важно, оператор *
- это просто неправильный оператор, используемый для создания указателя на name
. Вместо этого необходимо использовать адресный оператор &
.
Однако, поскольку getName()
объявлен как const
, его неявный указатель this
равен const
, и, таким образом, он получает доступ к name
как const
объект. Вы не можете вернуть указатель на неконстантный , который указывает на const
объект (без использования const_cast
, которого следует избегать).
Нет веских причин для не мутирующий метод получения, возвращающий poiner-to-non-const , указывающий на внутренние данные. Вместо этого он должен вернуть pointer-to-const , например:
const string* Student::getName () const;
// or: string const * Student::getName () const;
...
const string* Student::getName () const
// or: string const * Student::getName () const
{
return &name;
}
И затем вам необходимо разыменовать этот указатель при передаче string
в std::cout
, например:
cout << *(Giwrgos.getName());
Однако, поскольку указатель никогда не может быть нулевым, было бы лучше вернуть объект name
с помощью reference-to-const вместо pointer-to-const :
const string& Student::getName () const;
// or: string const & Student::getName () const;
...
const string& Student::getName () const
// or: string const & Student::getName () const
{
return name;
}
...
cout << Giwrgos.getName();
Или вы можете вместо этого вернуть объект name
по значению (который вернет копию данных string
) :
string Student::getName () const;
...
string Student::getName () const
{
return name;
}
...
cout << Giwrgos.getName();