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 :

Manipulation d'objet / de pointeurs


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 31
    Points
    31
    Par défaut Manipulation d'objet / de pointeurs
    Bonjour,

    J'éprouve un problème avec la manipulation d'objets. Je pensais avoir plutôt bien compris les concepts des objets, et des pointeurs en C++, mais il y a manifestement quelque chose qui m'échappe. Le problème n'est pas à la compilation, mais à l'exécution (segmentation fault).

    D'abord, je situe le contexte. Il s'agit d'un programme où je manipule des formes géométriques. J'ai créé une classe coord, qui contient une coordonnée, et une classe rectangle, qui contient les 4 coordonnées des coins, et celle du "centre".

    Une méthode getCenter() calcule le centre sur base d'une moyenne des coordonnées des côtés. Elle renvoie un pointeur vers une coordonnées. C'est dans cette méthode qu'il y a un problème.

    Un peu de code valant mieux qu'un long discours, le voici. Je ne mets pas les #include ni les fichiers d'en-tête car je suis à 99,9% certain qu'ils sont bons...

    La classe coord:
    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
    /* Constructeur: initialisation à 0 par défaut */
    coord::coord(){
        int x = 0;
        int y = 0;}
     
    coord::coord(int i, int j){
        x = i;
        y = j;}
     
    int coord::X(){
        return x;}
     
    int coord::Y(){
        return y;}
     
    void coord::setX(int n){
        x = n;}
     
    void coord::setY(int n){
        y = n;
    }
    La classe rectangle:
    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
    rectangle::rectangle(){
        coord* c = new coord();
        coord* coin1 = new coord();
        coord* coin2 = new coord();
        coord* coin3 = new coord();
        coord* coin4 = new coord();
    }
     
    coord* rectangle::getCenter(){
        int xCenter = coin1->X() + coin2->X() + coin3->X() + coin4->X();
        int yCenter = coin1->Y() + coin2->Y() + coin3->Y() + coin4->Y();
        cout<<endl<<"Ici ca va"<<endl;
        c->setX(5);
        cout<<endl<<"Ici ca va plus... "<<endl;
        c->setY(yCenter);
        return c;
    }
     
    void rectangle::setCoord(coord* c1, coord* c2, coord* c3, coord* c4){
            coin1 = c1;
            coin2 = c2;
            coin3 = c3;
            coin4 = c4;
    }
    Le fichier main.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int main(){
     
        coord* c1 = new coord(1, 1);
        coord* c2 = new coord(1, 4);
        coord* c3 = new coord(5, 1);
        coord* c4 = new coord(5, 4);
     
        rectangle* rect = new rectangle();
        rect->setCoord(c1, c2, c3, c4);
        coord* centre = rect->getCenter();
     
    }
    Comme vous le voyez, je crée 4 pointeurs vers des coordonnées. Ensuite, je crée un rectangle, et je lui assigne les coins.
    Puis je veux récupérer son centre.

    Le problème se situe à la ligne "c->setX(5);" (j'imprime des petits commentaires de débuggage. Vous verrez que c'est entre les 2 que ça plante).

    D'avance, merci beaucoup pour votre aide!

    PS: Je rajoute en attach un ZIP du code source, avec les en-têtes, (et qui compile...)
    Fichiers attachés Fichiers attachés

  2. #2
    Membre confirmé Avatar de toxcct
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 434
    Points : 511
    Points
    511
    Par défaut
    les adresses des pointeurs que tu alloue dans le constructeur de ta classe rect sont stockés dans des variables locales a ton constructeur, et dopnc pas sauvegardées...

    question 1: pourquoi ta classe rect n'a pas de destructeur ?
    question 2: pourquoi tu ne sauvegarde pas tes coord allouées dans des données membres ?
    question 3: pourquoi passer par des pointeurs plutot que par des objets membres ?

    je n'ai pas creusé plus loin pr l'instant, car tu as minifestement un pb de design...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Points : 31
    Points
    31
    Par défaut
    Ok merci, je vais répondre point par point:

    1. Le destructeur, je vais le faire après; c'est d'ailleurs indispensable pour mon programme qui devra tourner aussez longtemps...

    2. C'était bien ça le problème. Il me suffisait en fait, dans le constructeur de rectangle, de remplacer:
    coord* c = new coord();
    par:
    c = new coord();
    car en redéclarant c, je réduisais sa portée au constructeur... ce que j'ignorais.

    3. Je ne comprends pas la question...

    Merci encore!

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Renommes les methodes X et Y par getX et getY.
    Utilises la forme canonique de Coplien pour la construction des classes.
    Penses en terme d'aggrégation et de composition plutôt qu'en terme d'heritage.

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par gnulix
    3. Je ne comprends pas la question...
    Exactement comme tu l'as fait pour 'coord'....
    Dans 'coord' tu n'utilise pas de int* , alors pourquoi utiliser des coord* dans rectangle ?
    Un truc genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class rectangle {
       coord coins[4];
     
      // functions...   
     
     };

    De plus je dirai qu'il y a quand même un probleme conceptuel... la classe devrait s'appeler quadrilatere et non pas rectangle.
    Franchement, si tu comptes réutiliser le code plus tard, appeler un chat un chat est souvent très utile.

Discussions similaires

  1. Réponses: 13
    Dernier message: 09/05/2006, 16h30
  2. conserver ma liste d'objets sans Pointeur Null ...
    Par comme de bien entendu dans le forum Général Java
    Réponses: 8
    Dernier message: 24/03/2006, 11h55
  3. Manipulation d'objet MS-Access (Copie de table, états, form)
    Par Mustard007 dans le forum Bases de données
    Réponses: 1
    Dernier message: 14/02/2006, 21h37
  4. Construction objets et pointeurs
    Par Jahjouh dans le forum C++
    Réponses: 2
    Dernier message: 12/01/2006, 10h10
  5. Réponses: 2
    Dernier message: 03/12/2004, 21h37

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