Rechercher : dans
Par :

[C++] Erreur de compilation : méthodes ??

Dernière réponse le 5 fév 2008 à 23:35:35 azerty0, le 5 fév 2008 à 18:00:05 
 Signaler ce message aux modérateurs

Bonjour à tous,

je viens d'apprendre à créer des classes selon les méthodes du site du zéro, et le compilateur m'affiche ces erreurs :

C:\DOCUME~1\Quentin\LOCALS~1\Temp\ccI3baaa.o(.text+0x176)

 In function `main':   [Linker error] undefined reference to `Personnage::Personnage()' 

pour chacune de mes méthodes...
Configuration: Windows XP
Firefox 2.0.0.11

Meilleures réponses pour « [C++] Erreur de compilation : méthodes ?? » dans :
[Langage C] C/C++ Erreur de segmentation Voir Qu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
Compiler un programme en C avec Dev C++ sous Vista VoirIl est très probable que vous ayez des problèmes lors de la compilation d'une source C sous Vista avec Dev C++. Solution rapide de secours: le compilateur g++ Voici une astuce pour Dev-Cpp : Aller dans "Outils" -> "Options du compilateur" puis...
Java - Les exceptions VoirLa nécessité de détecter les erreurs Tout programme comporte des erreurs, même si celui-ci semble fonctionner à merveille. Chaque programmeur essaye de réduire au minimum le nombre d'erreurs, mais toutes les erreurs ne peuvent pas forcément être...

1

Mahmah, le 5 fév 2008 à 20:08:08

Salutations,

Il semblerait bien que le linker ne trouve pas le constructeur de ta classe, la raison la plus probable est qu'il ne soit pas codé.

basiquement on a donc
Déclaration:

// maClasse.h

#ifndef _MA_CLASSE_H
#define _MA_CLASSE_H

class MaClasse
{
public:
   MaClasse();
   virtual ~MaClasse();

   void uneMethode();

private:
   int m_iUnEntier;
};

#endif//_MA_CLASSE_H


Définition:
// maClasse.cpp

#include "maClasse.h"

MaClasse::MaClasse()
{
   m_iUnEntier = 27;
}


MaClasse::~MaClasse()
{
}

void MaClasse::uneMethode()
{
   return;
}



Cela correspond-t-il au ce que tu as à peu près ?

M.

Répondre à Mahmah

2

azerty0, le 5 fév 2008 à 20:26:07

Il me semble bien que oui.... =/

Enfin, je te laisse voir mais je n'y trouve pas d'erreur.

.cpp :

#include <string>
#include "Personnage.h"

using namespace std;

Personnage::Personnage()
{
    m_vie = 100;
    m_mana = 100;
}

Personnage::Personnage(string nomArme, int degatsArme)
{
    m_vie = 50;
    m_mana = 50;
    m_arme(nomArme, degatsArme);
}

Personnage::~Personnage();
{
}
                                   

void Personnage::recevoirDegats(int nbDegats)
{
     m_vie -= nbDegats;
     if(m_vie<0) m_vie=0;
}

void Personnage::attaquer(int Personnage &cible)
{
     cible.recevoirDegats(m_arme.getDegats());    
}

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

void Personnage::changerArme(string nomNouvelleArme, int degatsNouvelleArme)
{
    m_Arme.changer(nomNouvelleArme, degatsNouvelleArme);
}

bool Personnage::estVivant()
{
    if (m_vie > 0)return true; // VRAI, il est vivant !
    else return false; // FAUX, il n'est plus vivant !
}

void Personnage::afficherEtat()
{
     cout << "Vie : " << m_vie << endl;
     cout << "Mana : " << m_mana << endl;
     m_arme.afficher();    
}


.h :

#ifndef DEF_PERSONNAGE
#define DEF_PERSONNAGE
#include "Arme.h"

class Personnage
{
    public:

    Personnage();
    Personnage(std::string nomArme, int degatsArme);
    ~Personnage();
    void recevoirDegats(int nbDegats);
    void attaquer(Personnage &cible);
    void boirePotionDeVie(int quantitePotion);
    void changerArme(std::string nomNouvelleArme, int degatsNouvelleArme);
    bool estVivant();
    void afficherEtat();

    private:

    int m_vie;
    int m_mana;
    Arme m_arme;
};

#endif

Répondre à azerty0

3

Mahmah, le 5 fév 2008 à 21:57:10

Solutions numéro 2 et 2 bis

2)
Si c'est exactement un copier-coller alors le fichier cpp n'est pas compilé :
void Personnage::attaquer(int Personnage &cible) ferait une erreur. (et c'est la seule ^^)

et donc le main à beau connaître les fonctions déclarées dans le .h, au moment de rassembler effectivement le code, il tilte.


2) bis
Le code est compilé, génère un module (.o, .obj) mais celui-ci n'est pas linké avec les autres. (Et idem, le module du main tilte)


Accessoirement, j'aime beaucoup la p'tite convention de codage qui se dessine. (Etant un grand adepte de la notation hongroise)
Passer des strings par copie dans les paramètres j'aime moins.

M.

Répondre à Mahmah

4

 azerty0, le 5 fév 2008 à 23:35:35

Jvais voir ce que jpeux faire, merci :)

Répondre à azerty0
Collection CommentÇaMarche.net