J'essaye d'écrire un programme C ++ qui a une classe Student. J'essaie de créer un getter pour l'attribut name, mais j'obtiens cette erreur:

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

Des idées pourquoi?

Voici ce que j'ai fait jusqu'à présent:

#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;
}
0
Costas96 3 avril 2020 à 01:30

3 réponses

Meilleure réponse

Dans la classe étudiante, changez

string * getName () const; //Get name

À

string * getName (); //Get name

Puis changez:

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

À:

string * Student::getName ()
{
    return &name;
    //return c;
}
-1
Remy Lebeau 2 avril 2020 à 22:57

Comme l'erreur indique qu'il n'y a pas de mach pour l'opérateur *, le type d'opérande est const string, l'opération n'a pas de sens, vous essayez de déréférencer une variable sans pointeur et de la renvoyer en tant que pointeur.

Vous pouvez renvoyer un pointeur si vous renvoyez l'adresse de name:

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

Vous pouvez / devez renvoyer une référence:

const string& Student::getName () const
{
    return name;
}
3
anastaciu 2 avril 2020 à 23:09

Le membre name est déclaré comme un objet string, et non comme un pointeur string* vers un objet string. Votre méthode getName() est déclarée pour renvoyer un pointeur string*, mais elle essaie d'utiliser l'opérateur * pour transformer l'objet name en pointeur, ce qui ne fonctionnera pas. std::string n'a pas un tel operator* implémenté, c'est pourquoi vous obtenez l'erreur du compilateur. Mais, plus important encore, l'opérateur * est tout simplement le mauvais opérateur à utiliser pour créer un pointeur vers name. Vous devez utiliser l'opérateur d'adresse & à la place.

Cependant, puisque getName() est déclaré comme const, son pointeur implicite this est const, et donc il accède au name en tant qu'objet const . Vous ne pouvez pas renvoyer un pointeur vers non-const qui pointe vers un objet const (sans utiliser const_cast, ce que vous devez éviter).

Il n'y a aucune bonne raison pour qu'un getter non mutant renvoie un pointeur vers non const qui pointe vers des données internes. Il doit renvoyer un pointeur vers const à la place, par exemple:

const string* Student::getName () const;
// or: string const * Student::getName () const;

...

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

Et puis, vous devez déréférencer ce pointeur lorsque vous passez le string à std::cout, par exemple:

cout << *(Giwrgos.getName());

Cependant, comme le pointeur ne peut jamais être nul, il serait préférable de renvoyer l'objet name par reference-to-const plutôt que par 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();

Ou, vous pouvez renvoyer l'objet name par valeur à la place (qui renverra une copie des données string):

string Student::getName () const;

...

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

...

cout << Giwrgos.getName();
2
Remy Lebeau 2 avril 2020 à 23:11