IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Erreur à l'edition des liens lors de l'instanciation d'une classe


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 61
    Points : 47
    Points
    47
    Par défaut Erreur à l'edition des liens lors de l'instanciation d'une classe
    Bonjour,

    Il y a beaucoup de fichiers dans mon code, les voila je pense que je dois les mettre pour expliquer mon problème :

    Fichier skeleton.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    #ifndef _SKELETON_H
    #define _SKELETON_H
     
    #include <glut.h>
    class link;
     
    class skeleton abstract{
    public:
    	virtual void draw();			// Méthode d'affichage de la partie
    	void setvertices(GLfloat* vertices, int nbvertices);
    	void setlinks(link* links, int nblinks);
    protected:
    	link* links;					// Vecteur des liaisons vers les parties filles
    	int nblinks;					// Nombre de liaisons
    	GLfloat color[3];				// La couleur de la partie
    	GLfloat* vertices;				// Vecteur des points qui constituent l'objet
    	int nbvertices;				// Nombre de points
    };
     
    #endif
    Fichier skeleton.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include "skeleton.h"
     
    void skeleton::setvertices(GLfloat *vertices, int nbvertices){
    	this->vertices = vertices;
    	this->nbvertices = nbvertices;
    }
     
    void skeleton::setlinks(link *links, int nblinks){
    	this->links = links;
    	this->nblinks = nblinks;
    }
    Fichier skeletonBody.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class skeletonBody : public skeleton{
    public:
    	void draw();
    private:
    	GLfloat rotation[3];			// Angle de rotation de la partie
    	GLfloat translation[3];			// Vecteur translation de la partie par rapport au point (0,0) de l'environnement
    };
    Fichier skeletonBody.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #include "skeletonBody.h"
    #include "link.h"
    #include <glut.h>
     
    void skeletonBody::draw(){
    	glLoadIdentity();
    	glTranslatef(translation[0], translation[1], translation[2]);
    	glRotatef(rotation[0], 1, 0, 0);
    	glRotatef(rotation[1], 0, 1, 0);
    	glRotatef(rotation[2], 0, 0, 1);
     
    	glEnableClientState(GL_VERTEX_ARRAY);
    	glVertexPointer(3, GL_FLOAT, 0, vertices);
    	glBegin(GL_QUADS);
    	for(int i=0; i<nbvertices; i++){
    		glArrayElement(i);
    	}
    	glEnd();
    	for(int i=0; i<nblinks; i++){
    		glPushMatrix();
    		links[i].apply();
    		glPopMatrix();
    	}
    }
    Fichier main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <glut.h>
    #include "skeletonBody.h"
     
    int main(){
    	GLfloat bustepoints[] = {0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0};
    	skeletonBody buste;
    	return 0;
    }
    Et voici l'erreur que j'obtiens à l'édition des liens
    symbole externe non résolu "public: virtual void __thiscall skeleton::draw(void)"
    Je ne comprend pas pourquoi (je ne sais pas si c'est utile mais j'utilise visual c++ 2005)

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Déclare skeleton::draw() en tant que fonction membre virtuelle pure au lieu de simplement virtuelle.

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    C'est quoi ce mot abstract après skeleton ? Ca n'est pas du C++ en tout cas.

    Ensuite, si tu veux que skeleton::draw(); soit virtuelle pure (et par conséquence, que skeleton soit une classe abstraite), il faut déclarer cette fonction ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct skeleton
    {
    	virtual void draw() = 0;
    };

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 61
    Points : 47
    Points
    47
    Par défaut
    Excellent merci beaucoup ça marche maintenant. Pour le mot abstract vu que j'ai fait du java, j'avais essayé de faire comme en java pour voir si ca marchait, mais ca n'avait rien changé, et j'avais oublié de l'enlever ... on ne sait jamais
    Sinon par curiosité, pourquoi ca ne marchait pas avant ?

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Contrairement a une fonction normale, qui peut très bien ne pas être définie tant que personne ne l'utilise, une fonction virtuelle a besoin d'être :
    - Soit définie,
    - Soit déclarée pure (ce qui déclare implicitement la classe comme abstraite).

    Je ne connais pas assez la syntaxe java équivalente, mais le = est une écriture purement conventionelle, qui signifie juste "virtuelle pure". Il n'y a pas de =1 ou autre. Si on n'avait pas voulu économiser un mot clef, on aurait sûrement inventé une syntaxe plus lisible, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct skeleton
    {
    	virtual void draw() pure;
    };
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct skeleton
    {
    	virtual abstract void draw();
    };

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 61
    Points : 47
    Points
    47
    Par défaut
    Ok merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. crash lors de l'instanciation d'une classe
    Par malus56 dans le forum C++
    Réponses: 5
    Dernier message: 05/07/2011, 08h48
  2. Erreur lors de l'instanciation d'une classe
    Par Aloneghost dans le forum Langage
    Réponses: 6
    Dernier message: 21/06/2010, 21h14
  3. Null pointer lors de l'instanciation d'une class
    Par saraya dans le forum Langage
    Réponses: 4
    Dernier message: 06/05/2009, 17h53
  4. Erreur de numérotation des images lors de l'utilisation d'une référence
    Par mobi38 dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 9
    Dernier message: 03/09/2007, 16h36
  5. Réponses: 5
    Dernier message: 04/10/2006, 15h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo