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 :

[POO]Référence à un membre indéfinie


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Lycéen
    Inscrit en
    Juin 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2007
    Messages : 111
    Par défaut [POO]Référence à un membre indéfinie
    Salut !

    Je viens de bricoler une petite classe destinée à gérer une caméra avec OpenGL, mais j'ai une erreur que je ne comprends pas... Dans le fichier "camera.cpp", les références aux membres Camera::position ou Camera::orientation sont systèmatiquement indéfinies. Je vous présente mon code :

    1 fichier entete.h qui déclare ma classe Camera et la petite hiérarchie de données Point :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    struct Point
    {
        virtual Point& setX(float i) = 0;
        virtual Point& setY(float i) = 0;
    };
     
    struct Point2d: public Point
    {
        float x;
        float y;
     
        Point& setX(float i);
        Point& setY(float i);
    };
     
    struct Point3d: public Point
    {
        float x;
        float y;
        float z;
     
        Point& setX(float i);
        Point& setY(float i);
        Point& setZ(float i);
    };
     
    class Camera
    {
        public:
            Camera(float x, float y, float z);
            ~Camera();
     
            static void setPosition(float x, float y, float z);
            static void setOrientation(float x, float y, float z);
            Camera& show();
        private:
            static Point3d position;
            static Point3d orientation;
    };
    Le fichier points.cpp, qui définit les structures de données Point2d et Point3d :

    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
    26
    27
    28
    29
    30
    /* structure Point2d */
     
    Point& Point2d::setX(float i)
    {
        this->x = i;
        return *this;
    }
    Point& Point2d::setY(float i)
    {
        this->y = i;
        return *this;
    }
     
    /* structure Point3d */
     
    Point& Point3d::setX(float i)
    {
        this->x = i;
        return *this;
    }
    Point& Point3d::setY(float i)
    {
        this->y = i;
        return *this;
    }
    Point& Point3d::setZ(float i)
    {
        this->z = i;
        return *this;
    }
    Et le fichier problèmatique camera.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
    26
    27
    28
    29
    30
    Camera::Camera(float x, float y, float z)
    {
        setPosition(x, y, z);
        setOrientation(0.0, 0.0, -100.0);
    }
     
    Camera::~Camera()
    { /* rien à détruire */
    }
     
    void Camera::setPosition(float x, float y, float z)
    {
        Camera::position.x = x; /* références indéfinies */
        Camera::position.y = y;
        Camera::position.z = z;
    }
     
    void Camera::setOrientation(float x, float y, float z)
    {
        Camera::orientation.x = x; /* références indéfinies */
        Camera::orientation.x = y;
        Camera::orientation.z = z;
    }
     
    Camera& Camera::show()
    {
        gluLookAt(position.x, position.y, position.z, orientation.x, orientation.y, orientation.z, 0.0, 1.0, 0.0);
     
        return *this;
    }
    L'erreur exacte renvoyée est :
    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
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.cpp
    Compiling: points.cpp
    Compiling: camera.cpp
    Linking executable: Test2D.exe
    .objs\camera.o:camera.cpp:(.text+0x93): undefined reference to `Camera::position'
    .objs\camera.o:camera.cpp:(.text+0x9b): undefined reference to `Camera::position'
    .objs\camera.o:camera.cpp:(.text+0xa3): undefined reference to `Camera::position'
    .objs\camera.o:camera.cpp:(.text+0xb1): undefined reference to `Camera::orientation'
    .objs\camera.o:camera.cpp:(.text+0xb9): undefined reference to `Camera::orientation'
    .objs\camera.o:camera.cpp:(.text+0xc1): undefined reference to `Camera::orientation'
    .objs\camera.o:camera.cpp:(.text+0xe2): undefined reference to `Camera::orientation'
    .objs\camera.o:camera.cpp:(.text+0xec): undefined reference to `Camera::orientation'
    .objs\camera.o:camera.cpp:(.text+0xf6): more undefined references to `Camera::orientation' follow
    .objs\camera.o:camera.cpp:(.text+0x100): undefined reference to `Camera::position'
    .objs\camera.o:camera.cpp:(.text+0x10a): undefined reference to `Camera::position'
    .objs\camera.o:camera.cpp:(.text+0x114): undefined reference to `Camera::position'
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 6 seconds)
    Et sinon, dois-je mettre dans le constructeur de la classe Camera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    position = Point3d();
    orientation = Point3d();
    ou est-ce facultatif ?

    Merci d'avance

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Tu trouveras la réponse dans la FAQ, plus précisément la partie concernant les données et membres statiques.

    Mais en fait je ne vois pas pourquoi tu les mets statiques surtout.

    MAT.
    (ps: et ça n'a pas de rapport avec la POO sinon)

  3. #3
    Membre confirmé
    Profil pro
    Lycéen
    Inscrit en
    Juin 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2007
    Messages : 111
    Par défaut
    Etonnante, cette F.A.Q. ...

    En effet, le problème n'était pas de la POO, mais ça je ne le savais pas

    Sinon ces membres sont statiques car il n'y a qu'une caméra, et que des fonctions exterierues à celles qui ont créer l'objet camera doiveent intéragir avec. Je m'en sert donc comme mécanisme de varibale globale interne.

    Merci pour ton aide, A+

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par <Zer0>
    Sinon ces membres sont statiques car il n'y a qu'une caméra
    C'est donc pas plutôt l'instance de caméra qui devrait être statique ?

    MAT.

  5. #5
    Membre confirmé
    Profil pro
    Lycéen
    Inscrit en
    Juin 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2007
    Messages : 111
    Par défaut
    Bah... elle l'est aussi... Mais maintenant que mon code fonctionne, je me rend compte qu'il y a pleins de trucs qui ne vont pas... je vais sans doute tout recommencer :p

    A+

Discussions similaires

  1. [POO] Utiliser un membre static ailleurs ou ?
    Par Metallizer dans le forum C++
    Réponses: 2
    Dernier message: 04/12/2008, 18h45
  2. [POO] Classe vs constructeur indéfini
    Par FadeOut dans le forum C++
    Réponses: 3
    Dernier message: 25/11/2008, 03h29
  3. POO référence et objet
    Par jeremypd dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 06/03/2008, 15h38
  4. [POO] Lister les membres d'une classe
    Par Asmodean dans le forum Langage
    Réponses: 2
    Dernier message: 11/05/2007, 11h28
  5. [POO] Référence inter objet
    Par drclean86 dans le forum Langage
    Réponses: 2
    Dernier message: 21/01/2007, 18h39

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