нет совпадения для 'operator *' (тип операнда 'const string' {aka 'const std :: __ cxx11 :: basic_string <char>'}) - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь написать программу на C ++ с классом Student. Я пытаюсь создать метод получения атрибута name, но получаю эту ошибку:

\ApplicationFile.cpp:95:9: error: no match for 'operator*' (operand type is 'const string' {aka 'const std::__cxx11::basic_string'})
  return *name; 

Есть идеи, почему?

Это то, что я сделал до сих пор:

#include <iostream>
#include <string.h>
#include <string>
#include <stdio.h>

using namespace std;

class Student
{
    char *AM;
    string name;
    int semester, lessons;
    float *passed;

public:
    Student (const char *am, string n); //Constructor that I give only the serial number (AM) and the name
    Student (const char *am, string n, int semester); //Constructor that I give only the serial number (AM), the name and the semester
    Student (const char *am, string n, int semester, int lessons, float * passed); //Constructor that  I give values to all the attributes
    Student (Student &x);
    void setAm (const char *am); //Set serial number
    char * getAm () const; //Get serial number 
    void setName (string n); //Set name
    string * getName () const; //Get name
};

//Only AM and Name
Student::Student(const char *am, string n)
{
    int l = strlen (am);
    AM = new char [l + 1];
    strcpy (AM, am);

    name = n;
    semester = 1;
    lessons = 0;
    *passed = {0};
}

//Only serial number (am), name (n), semester (e)
Student::Student(const char * am, string n, int e)
{
    int l = strlen (am);
    AM = new char [l + 1];
    strcpy (AM, am);
    name = n;
    semester = e;
    lessons = 0;
    *passed = {0};
}

//Constructor that we give values to all variables
Student::Student(const char * am, string n, int e, int perasm, float *p)
{
    int l = strlen (am), i;
    AM = new char [l + 1];
    strcpy (AM, am);
    name = n;
    semester = e;
    lessons = perasm;

    *passed = *p;
}

void Student::setAm(const char *am)
{
    delete [] AM;
    int l = strlen(am);
    AM = new char[l + 1];
    strcpy (AM, am);
}

char * Student::getAm() const
{
    return AM;
}

void Student::setName (const string s)
{
    name = s;
}

string * Student::getName () const
{
    return *name;
    //return c;
}

int main()
{
    Student Kostas("123", "Kostas");
    cout << Kostas.getAm() <<endl;
    Kostas.setAm("354");
    cout << Kostas.getAm() <<endl;

    float p[] = {5.1, 4.4, 0.0, 0.0, 0.0};
    Student Giwrgos("678", "Giwrgos", 6, 5, p);
    cout << Giwrgos.getName();
    return 0;
}

Ответы [ 3 ]

3 голосов
/ 03 апреля 2020

Поскольку в сообщении об ошибке отсутствует оператор *, тип операнда const string, операция не имеет смысла, вы пытаетесь разыменовать переменную без указателя и вернуть ее в качестве указателя.

Вы можете вернуть указатель, если вернете адрес name:

const string *Student::getName () const
{
    return &name;    
}

Вы можете / должны вернуть ссылку:

const string& Student::getName () const
{
    return name;
}
2 голосов
/ 03 апреля 2020

Элемент 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();
0 голосов
/ 03 апреля 2020

В классе Student измените

string * getName () const; //Get name

на

string * getName (); //Get name

, а затем измените:

string * Student::getName () const
{
    return *name;
    //return c;
}

до:

string * Student::getName ()
{
    return &name;
    //return c;
}
...