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

Langage C++ Discussion :

Allocation de pointeur dans le constructeur ou pas ?


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 7
    Par défaut Allocation de pointeur dans le constructeur ou pas ?
    Bonjour tout le monde,

    Je souhaiterais savoir quelquechose qui m'intrigue assez, faut-il allouer dynamiquement un pointeur appartenant à une classe dans le constructeur ou faut-il juste l'initialiser a NULL ? Je vous donne un petit exemple :

    classe.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class A{
        public:    
        A();
        private:
        int* p;
    };
    classe.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A::A(){
        p=new int; OU p=NULL; ?
    }
    Merci d'avance.
    Beulard.

  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,

    Ça dépend de ce que tu veux en faire...

    Au passage il vaut mieux utiliser la liste d'initialisation.

    MAT.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut, et bienvenue sur le forum

    Les deux sont possibles, en fonction de ce que tu veux faire précisément.

    Mais ton exemple prête à confusion à cause de l'utilisation d'un int, ce qui rend encore la réponse plus compliquée

    Si tu envisage d'utiliser le pointeur pour allouer dynamiquement un tableau C style, le meilleur conseil que tu recevra sera... d'éviter cette méthode au profit de la classe vector, disponible dans l'espace de noms std (comme tout ce qui est fourni par le standard) par simple inclusion du fichier d'en-tête <vector>.

    Cette classe présente tous les avantages des tableaux "C style" sans en présenter les inconvénients.

    Si le recours à un pointeur se justifie, il y a deux grandes possibilités:

    • Soit, tu sais exactement ce que tu dois créer, et il est alors préférable de le créer directement
    • Soit tu ne sais pas ce que tu dois créer, et il est alors préférable d'initialiser ton pointeur à NULL, car l'invocation de delete sur NULL est garantie sans effet.
    Cependant, si ton pointeur a pour but de mettre l'instance de ta classe en relation avec une autre instance (de la même classe ou non), qui peut exister ou non, il y a fort à parier que la dite instance aura été créée par ailleurs, et qu'il s'agira donc de transmettre un pointeur vers celle-ci (avec, le cas échéant, une valeur par défaut à NULL) au constructeur, et d'initialiser directement le pointeur avec celui reçu en argument

    En bref: aide nous à t'aider : plus tu nous donnera d'informations, plus nous pourrons répondre précisément à ta question, qui, en l'état, est malheureusement trop vague pour que nous puissions le faire
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 7
    Par défaut
    Bonjour, et merci pour vos réponses.

    D'accord, prenons un exemple concret.
    En copiant sur un tutoriel, donnons une classe Personnage qui aurait dans ses attributs un pointeur sur une instance de la classe Arme.

    Disons que si l'on lance le "jeu", le Personnage créé dans le main n'a aucune arme de départ. Cet attribut sera bien sûr modifié au fil du temps. Dans le constructeur de Personnage, doit-on initialiser le pointeur sur Arme à NULL ou doit-on directement l'allouer dynamiquement ?

    J'éspère avoir été plus clair cette fois.

    Merci d'avance,
    Beulard.

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Ton personnage est il sensé avoir directement un arme, fusse-t-elle de base, ou devra-t-il commencer par se battre à mains nues pour obtenir la moindre branche pouvant servir d'arme

    S'il est sensé voir directement une arme de base, s'agit il d'une arme pré définie, ou y a-t-il une quelconque sélection de l'arme effectuée (ex: un guerrier commence avec une épée, un archer avec un arc et un magicien avec un baton)

    Si tu réponds à ces deux questions, tu réponds à celle de l'initialisation de ton pointeur :

    S'il commence tout à fait désarmé, tu initialisera le pointeur à NULL, s'il a déjà une arme de base en commençant, ou bien fournis un pointeur dessus dans le constructeur et tu initialise donc le pointeur avec celui fourni comme argument, ce qui permet de "sélectionner" l'arme de départ, ou bien tu effectue l'allocation dynamique de la mémoire directement dans le constructeur (ou plutôt dans la liste d'initialisation), si tout le monde commence avec la même

    Comme tu peux le voir, même en présentant une situation qui peut sembler claire, il reste un certain nombre de questions auxquelles il peut être utile d'apporter une réponse, de manière à être tout à fait certain du choix que tu fera en définitive

    C'est d'ailleurs le propre de la programmation de manière générale: il faut toujours être particulièrement attentif à se poser les bonnes questions, de manière à être tout à fait sur de la situation tout à fait particulière dans laquelle on se trouve
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    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
    Ou tu instancies une arme de type "pas d'arme".

    MAT.

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

Discussions similaires

  1. Allocation mémoire (new) dans un constructeur
    Par Khan34 dans le forum C++
    Réponses: 3
    Dernier message: 23/01/2012, 13h57
  2. Allocation pointeur (pointeur dans un type)
    Par tyler007 dans le forum Fortran
    Réponses: 11
    Dernier message: 01/06/2007, 14h39
  3. Réponses: 6
    Dernier message: 24/11/2006, 12h21
  4. Réponses: 11
    Dernier message: 20/10/2006, 13h19
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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