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 :

question sur les pointeurs


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Par défaut question sur les pointeurs
    Bonjour, on m'avait dit un jour qu'on pouvait éviter l'écriture des pointeurs en C++ pour ne pas écrire comme en C. Par exemple, avec le passage par référencement dans une méthode :

    Ecran::affichage(const float &couleur) {...}

    Lorsque j'instancie un object (ici roue) dans un autre objet (ici voiture) je fais comme ça :

    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
    Class::Voiture() {
     
    public:
        Voiture();
     
    private:
        Roue *roue;
    }
     
    Voiture::Voiture() {
        roue = new Roue(4);
    }
     
    Voiture::status() {
        std::cout << roue->taille() << std::endl;
    }
    Ma question est la suivante, puis-je éviter d'avoir un pointeur sur roue ?

    Merci d'avance :-)

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Salut,

    oui tu n'as aucun intérêt au pointeur ici : tu n'utilises pas de polymorphisme et le crées lors de l'appel au constructeur.
    Tu peux donc simplement déclarer ta variable membre comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Class::Voiture() {
     
    public:
        Voiture();
     
    private:
        Roue roue;
    };
    Et l'initialiser via la liste d'initialisation (obligatoire si le constructeur de Roue prend des paramètres)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Voiture::Voiture()
      : roue(4)
    {}
    Et dans tous les cas, un unique_ptr sera préférable à un pointeur nu : un unique_ptr est responsable de la libération du pointeur, tu enlèves donc l'ambiguité de savoir à qui revient la responsabilité de le faire.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Par défaut
    Merci, en effet j'utilise les pointeurs intelligents pour éviter les fuites mémoires ...

    Mais lorsque j'écris

    private:
    Roue roue;

    puis roue(4) dans le constructeur, il me semblait que ça m'instanciait 2 fois l'object avec un premier appel au constructeur par défaut, puis un appel au constructeur spécifique ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    La vie d'un objet commence par l'appel du constructeur et se termine par l'appel du destructeur. Un objet ne peut être instancié qu'une fois, et sauf appel explicite douteux du destructeur ce dernier n'est aussi appelé qu'une fois.
    La construction des membres se fait avant l'exécution du corps du constructeur, et justement comme te l'a dit Bousk, on peut préciser comment ils doivent être construits grâce à la liste d'initialisation qui sert justement à celà.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Obj {
       std::string x;
       std::string y;
       std::string z = "3";
       Obj() : y("1") {  // x est construit vide, y est construit avec "1", z est construit avec "3"
          x = "2";       // Puis x est modifié, il aurait pu être pré-initialisé
       }
       ~Obj() {
          z.clear();  // évidemment inutile car
       }              // z est détruit, y est détruit, puis x est détruit
    };

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Par défaut Merci
    Merci, c'est plus clair maintenant, j'ai compris.

    J'avais un problème de conception, dans le codage de mes constructeurs par défaut et du coup je ne pouvait modifier l'objet.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Par défaut zut
    J'ai une nouvelle petite question :

    Maintenant dans mon armature.h, j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Armature::Armature(cv::Mat &Image): Image_(Image) {}
    Je veux que l'adresse de Image_ soit la même que Image. Mais dans ce cas précis, il s'agit d'une copie d'objets non ?

    Merci d'avance

  7. #7
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Si tu veux partager l'objet, il faut utiliser un pointeur ou une référence. Le mieux, pour la notion de partage, étant probablement le shared_ptr.

Discussions similaires

  1. Question sur les pointeurs génériques
    Par mikedavem dans le forum C
    Réponses: 16
    Dernier message: 24/05/2006, 11h56
  2. question sur les pointeurs
    Par jd.baculard dans le forum Langage
    Réponses: 3
    Dernier message: 18/03/2006, 02h30
  3. [Debutant] Nouvelle question sur les pointeurs
    Par etiennegaloup dans le forum Débuter
    Réponses: 3
    Dernier message: 11/01/2006, 09h55
  4. Question sur les pointeurs.
    Par Chrisemi dans le forum C++
    Réponses: 5
    Dernier message: 28/10/2005, 23h47
  5. questions sur les pointeurs
    Par Hyoga dans le forum C++
    Réponses: 17
    Dernier message: 08/01/2005, 23h25

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