Partage
  • Partager sur Facebook
  • Partager sur Twitter

erreur C2228

la partie gauche de '.affichstat' doit avoir un class/struct/union

Sujet résolu
9 août 2022 à 22:16:57

bonjour j'était en train de faire le cours sur l'heritage de open classroom en c++ quand cet erreur que je n'ai pas réussi à resoudre est survenu.

error C2228: la partie gauche de '.affichstat' doit avoir un class/struct/union

voici mon code

Personnage.hpp:

#ifndef DEF_PERSONNAGE
#define DEF_PERSONNAGE

#include<string>
#include "Arme.hpp"

class Personnage// on peut aussi faire struct personnage mais du coup par défault tou est en public et non en privé
{
    public://met tout en public pour que les méthodes et les attribues puisse etres appelé en dehors de la class

//méthodes
    Personnage();//contructeur
    Personnage(std::string nom, std::string nomarme, int degatsarme);//survharge constructeur
    ~Personnage();//destructeur
    Personnage(Personnage const& personnageACopier);//constructeur de copie
    Personnage& operator=(Personnage const& personnageACopier);//operateur d'affection
    void recevoirDegats(int nbDegats);
    void attaquer(Personnage& cible);
    void boirePotionDeVie(int quantitePotion);
    void changerArme(std::string nomNouvelleArme, int degatsNouvelleArme);
    bool estVivant() const;
    void affichstat() const;// const dit à l'ordinateur que cette méthode ne modifie rien

   // private://fait que les attributs ne peuvent pas etre appelé en dehors de la class
    protected:// Privé, mais accessible aux éléments enfants (ici necromancien)
// Attributs
    int m_vie;
    int m_mana;
    //Arme m_arme;
    Arme* m_arme;
    std::string m_nom;
    
};

#endif





Personnage.cpp

#include"Personnage.hpp"
#include<iostream>
using namespace std;

Personnage::Personnage() : m_vie(100), m_mana(100), m_arme(nullptr)
{
    m_arme = new Arme();
}

Personnage::Personnage(string nom , string nomarme, int degatsarme) : m_vie(100), m_mana(100), m_arme(nullptr), m_nom(nom)
{
    m_arme = new Arme(nomarme, degatsarme);
}

Personnage::~Personnage()
{
    delete m_arme;
}

Personnage::Personnage(Personnage const& personnageACopier)
    : m_vie(personnageACopier.m_vie), m_mana(personnageACopier.m_mana), m_arme(nullptr)
{
    m_arme = new Arme(*(personnageACopier.m_arme));//vu que arme est un pointeur on lui dit avec cet ligne qu'il ne doit pas copié
    //l'addresse mais qu'il doit pointer vers une autre addresse et y copier le contenue de l'arme a copié
}

Personnage& Personnage::operator=(Personnage const& personnageACopier)
{
    if (this != &personnageACopier)
        //On vérifie que l'objet n'est pas le même que celui reçu en argument
    {
        m_vie = personnageACopier.m_vie; //On copie tous les champs
        m_mana = personnageACopier.m_mana;
        delete m_arme;
        m_arme = new Arme(*(personnageACopier.m_arme));
    }
    return *this; //On renvoie l'objet lui-même
}//la différence entre l'operateur= et le constructeur de copie est que le constructeur est utilisé à l'initialisation alors que 
//l'operateur est utilisé si on ll'affecte à un autre objet par la suite (ex:Personnage thorgal(jean_baptiste)= constructeur// thorgal = jean baptiste = operateur)

void Personnage::recevoirDegats(int nbDegats)
{
    m_vie -= nbDegats;
    if (m_vie <= 0)
    {
        m_vie = 0;
        cout << (m_nom != "" ? m_nom :"")<< (m_nom != "" ? " est mort ": "") << endl;
    }
}

void Personnage::attaquer(Personnage& cible)
{
    cible.recevoirDegats(m_arme->m_degats);//si on le fait sans pointeur c m_arme.m_degtas
}

void Personnage::boirePotionDeVie(int quantitePotion)
{
    if (m_vie <= 100 - quantitePotion)
    {
        m_vie += quantitePotion;
    }
    else
    {
        m_vie = 100;
    }
}

void Personnage::changerArme(string nomNouvelleArme, int degatsNouvelleArme)
{
    m_arme->changer( nomNouvelleArme, degatsNouvelleArme);//on met la flèches(->) à la place du point  car c'est un pointeur
}

bool Personnage::estVivant() const
{

    return m_vie > 0;

}

void Personnage::affichstat() const
{
    cout << "vie: " << m_vie;
    cout << ", mana: " << m_mana;
    m_arme->afficher();
    cout <<", nom: "<<(m_nom == "" ? " no name" : m_nom) << endl;
}




Arme.hpp:

#ifndef DEF_ARME
#define DEF_ARME

#include<string>

class Arme
{
public:
	Arme();//constructeur
	Arme(std::string nom, int degats);
	void changer(std::string nomNouvelleArme, int degatsNouvelleArme);
	void afficher() const;

//private:
	std::string m_nom;
	int m_degats;
};
#endif




Arme.cpp:

#include"Arme.hpp"
#include<iostream>
using namespace std;

Arme::Arme() : m_nom("epee rouille"), m_degats(10)
{

}

Arme::Arme(std::string nom, int degats) : m_nom(nom), m_degats(degats)
{

}

void Arme::changer(string nomNouvelleArme, int degatsNouvelleArme)
{
    m_nom = nomNouvelleArme;
    m_degats = degatsNouvelleArme;
}

void Arme::afficher() const
{
    cout << ", degats de l'arme: " << m_degats;
    cout << ", nom de l'arme: " << (m_nom == "" ? " no name" : m_nom) << endl;
}


necromancien.hpp:

#ifndef DEF_NECROMANCIEN
#define DEF_NECROMANCIEN

#include <iostream>
#include <string>
#include "Personnage.hpp"
//Ne pas oublier d'inclure Personnage.hpp pour pouvoir en hériter !

class necromancien : public Personnage
	//Signifie : créer une classe Guerrier qui hérite de la classe Personnage
{
    public:
	necromancien();
	necromancien(std::string nom , std::string nomarme, int degatsarme);
	void affichstat() const;

private:
	int m_âme;

};

#endif





necromancien.cpp:

#include"necromancien.hpp"
#include<string>
#include<iostream>
using namespace std;

necromancien::necromancien() : Personnage(), m_âme(0)
{
}

necromancien::necromancien(string nom , string nomarme, int degatsarme) : Personnage(nom , nomarme, degatsarme), m_âme(0)
{
}

void necromancien::affichstat() const
{
    Personnage::affichstat();
    cout << "je maitrise les ames";
}


main.cpp:

#include"Personnage.hpp"

#include<string>
#include<iostream>
#include "necromancien.hpp"
using namespace std;

int main()
{
    Personnage thorgal("thorgal" , "epee acere", 20), jean_baptiste;//créé deux objet l'un s'appelle thorgal l'autre jean baptiste
    necromancien doliark();
    jean_baptiste.changerArme("faux tenebreuse", 100);
    jean_baptiste.attaquer(thorgal);
    cout << "jean baptiste: ";
    jean_baptiste.affichstat();
    cout << "thorgal: ";
    thorgal.affichstat();
    thorgal = jean_baptiste;
    thorgal.affichstat();
    doliark.affichstat();

}





il me dit que l'erreur se trouve à la dernière ligne de main (doliark.affichstat();)

mais quand j'initialise doliark avec le second constructeur (donc quand je fais necromancien doliark("doliark","faux", 18);)

il n'y a aucun problème.

est se que quelqu'un pourrai m'aider? merci d'avance.

-
Edité par altrastorique 10 août 2022 à 10:56:37

  • Partager sur Facebook
  • Partager sur Twitter
10 août 2022 à 0:01:05

Utilises le bouton code </> du forum pour poster ton code ! (tu peux modifier ton post, lien modifier en haut à droite du post).

  • Partager sur Facebook
  • Partager sur Twitter
...
10 août 2022 à 10:23:11

merci. C'est bon je l'ai modifié

  • Partager sur Facebook
  • Partager sur Twitter
10 août 2022 à 10:31:14

Bonjour,

Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

Pour plus d'informations, nous vous invitons à lire les règles générales du forum

Merci de colorer votre code à l'aide du bouton Code

Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: cpp;">Votre code ici</pre>.

Merci de modifier votre message d'origine en fonction. Le bouton code en image cela donne :

Liens conseillés

  • Partager sur Facebook
  • Partager sur Twitter
10 août 2022 à 11:13:06

Supprime juste les parenthèses derrière doliark, comme tu as fait pour jean_baptiste

Remarque: évite les accents dans les noms de variables

  • Partager sur Facebook
  • Partager sur Twitter
10 août 2022 à 11:24:26

Ne suis pas ce cours qui est une infame obsolescence et instruit une palanquée de choses à ne pas faire.
  • Partager sur Facebook
  • Partager sur Twitter

git is great because Linus did it, mercurial is better because he didn't.

10 août 2022 à 11:30:42

Pour completer à ce que dit Markand, tu peux trouver un cours de C++ bien meilleur sur le site de zeste de savoir:

https://www.zestedesavoir.com

  • Partager sur Facebook
  • Partager sur Twitter

Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

10 août 2022 à 12:00:43

Merci beaucoup maintenant ça marche

  • Partager sur Facebook
  • Partager sur Twitter
10 août 2022 à 12:46:23

J'ai l'impression que le cours a été remis à jour en début 2022, et plus moderne que l'ancien (dans ma petite mémoire). Me trompe-je ?
  • Partager sur Facebook
  • Partager sur Twitter
10 août 2022 à 13:01:22

Tu te trompes, ils ont viré du contenu, ajouté des vidéos, mais ça reste la même bouse.
  • Partager sur Facebook
  • Partager sur Twitter

Si vous ne trouvez plus rien, cherchez autre chose.

10 août 2022 à 20:42:28

Personnellement je trouve que les cours expliquent très bien
  • Partager sur Facebook
  • Partager sur Twitter
10 août 2022 à 21:09:18

Très bien expliquer des choses fausses n'en fait pas un bon cours.

  • Partager sur Facebook
  • Partager sur Twitter
11 août 2022 à 8:04:33

On a pas jugé la capacité pédagogique du cours qui en fait un effectivement ultra attrayant mais la qualité du contenu. Ce cours est destiné au C++98 et ne parle même pas de la norme minimale du C++11 (11 ans déjà !).

En bref, tu sors de ce cours et :

  • Tu ne connaitras rien au C++11, C++14, C++17, C++20, C++23 ;
  • Tu vas te plonger dans un projet C++ et tu ne connaitra rien des fonctionnalités de bases importantes (RAII) ;
  • Tu vas utiliser des pointeurs à tire-larigot parce que c'est comme ça qu'on faisait il y a 30 ans.
  • Partager sur Facebook
  • Partager sur Twitter

git is great because Linus did it, mercurial is better because he didn't.

11 août 2022 à 8:34:23

Je confirme.

Mon programme scolaire en 2005 était basé sur du c++98 et je n'ai pas réussi à assimiler le quart de ce que les profs expliquaient : pour eux le C++ c'était juste une mise à jour du C, qui permettait de faire du mode fenêtré avec <windows.h>. Du coup c'était encore plus confus pour moi...

En gros, faire du C++ c'était utiliser new/delete à la place de malloc/free et utiliser cette librairie infame qui me fait encore faire des cauchemars!

Quand je suis tombé sur le cours sur le Site du Zéro, j'étais ravi car j'ai trouvé que ça expliquait clairement des notions qui étaient complètement abstraites pour moi (en tout cas mieux expliqué que mes profs :p).

Mais avec le recul et les années qui passent, je me rends compte qu'il est complètement obsolète et, certes, apprend des choses, mais pas de la bonne manière. Sans compter énormément de notions qui sont à peine abordées.

Elle est où la SL? (un pauvre chapitre très incomplet dans le cours sur l'orienté objet) Et les smart pointers? On ne parle même pas de RAII ou de SOLID (que je n'ai toujours pas bien assimilé).

Du coup je me suis fait violence et ai acheté le bouquin c++ primer 5 et, je suis à peine au 4e chapitre sur les expressions (autant dire au début) que je me rends déjà compte à quel point le cours d'OC est vide!

  • Partager sur Facebook
  • Partager sur Twitter