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 :

Instanciation dangereuse ?


Sujet :

C++

  1. #1
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut Instanciation dangereuse ?
    Bonjour,

    Pour les besoins d'une application je suis confronté à un problème quelque peu tordu
    J'ai 2 classes, classeA et classeB.
    J'aimerais pouvoir créer (de façon dynamique) un objet de type classeA via un pointeur membre de classeB.
    hum, bon ok voici un petit exemple:

    dans main.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
     
    class classeA 
    { 
      public: 
        int entierA;  
        void creerObjet(classeA **p);
        void libererMem(classeA **p);  
    };   
     
     
    class classeB 
    {  
      public:
         classeA *m_pClasseA;  //Pointeur membre sur classeA
    };
    dans main.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
    31
    32
    33
     
    void classeA::creerObjet(classeA **p)
    {
       *p = new classeA; //alloue de la mémoire pour un nouvel objet
       return; 
    }
     
    void classeA::libererMem(classeA **p)
    {
       delete *p; //Libère la mémoire alloué
       return; 
    }
     
     
    int main(int argc, char *argv[])
    {
      classeB *pCB = new classeB;//Créé un objet classeB via un pointeur
     
      pCB->m_pClasseA = 0;//initialise les membres
      pCB->entierB = 0;
     
      pCB->m_pClasseA->creerObjet(&(pCB->m_pClasseA));
      pCB->m_pClasseA->entierA = 56;// On peut maintenant accéder aux 
                                                       // membres du nouvel objet de type  
                                                       // classeA via un pointeur sur un objet 
                                                      //de type classeB
     
      pCB->m_pClasseA->libererMem(&(pCB->m_pClasseA));
      delete pCB;
     
      system("PAUSE"); 
      return 0;
    }
    Apparement ce petit programme fonctionne mais, n'étant pas un guru du c++ j'aimerais
    savoir si cet exemple est correcte et si je peux m'en servir dans un programme plus conséquent sans courir de risques ?

    D'avance merci

    Tintin 72

  2. #2
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut Re: Instanciation dangereuse ?
    Citation Envoyé par tintin72
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      pCB->m_pClasseA = 0;//initialise les membres
      pCB->entierB = 0;
     
      pCB->m_pClasseA->creerObjet(&(pCB->m_pClasseA));
    Apparement ce petit programme fonctionne
    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pCB->m_pClasseA = NULL; // c'est mieux
    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pCB->m_pClasseA = NULL;
    pCB->m_pClasseA->creerObjet(&(pCB->m_pClasseA));
    ton pointeur ne pointe sur rien, comment fais-tu pour accéder à une fonction de la classe A à partir d'un pointeur NULL ???

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Pourquoi pas simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      pCB->m_pClasseA  = new classeA;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete  pCB->m_pClasseA;
    Si tu veux des fonctions spéciales, pourquoi pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class classeA 
    { 
      public: 
        int entierA;  
        static classeA *creerObjet(); 
        void libererMem(classeA *p);  // pourquoi **p ??
    };
    .....
      pCB->m_pClasseA  = classeA::creerObjet();
    Note :Si creerObjet a besoin d'attributs de this, alors la fonction ne peut être statique et doit être appelée à partir d'une instance existante de classeA.

  4. #4
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    ton pointeur ne pointe sur rien, comment fais-tu pour accéder à une fonction de la classe A à partir d'un pointeur NULL ???
    ça je n'en sais rien effectivement, mais lorsque j'écris

    pCB->m_pClasseA->entierA = 56;

    le prog ne plante pas ce qui prouve que la mémoire a bien été alouée non ?


    Tintin72

  5. #5
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    normalement ça aurait du planter à l'exécution.

    le fait qu'un programme tourne ne veut pas dire que tout s'est bien passé. suivant l'erreur commise il peut y avoir un comportement indéterminé. ça a l'air de marcher jusqu'au jour où ça plante méchamment

  6. #6
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    le fait qu'un programme tourne ne veut pas dire que tout s'est bien passé. suivant l'erreur commise il peut y avoir un comportement indéterminé. ça a l'air de marcher jusqu'au jour où ça plante méchamment

    Tout à fait d'accord, c'est d'ailleurs pour ça que je viens demander conseil sur ce forum

    Tintin72

  7. #7
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    D'après Bjarne Stroustrup, NULL est une macro remplaçant 0 .... (pour un des post plus haut)

  8. #8
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par Alp
    D'après Bjarne Stroustrup, NULL est une macro remplaçant 0 .... (pour un des post plus haut)
    Oui mais j'pense qu'il te l'a mis parce que 0 tu vois pas tout de suite si on parle d'un entier ou d'un pointeur.

    Tu vois NULL, tu sais tout de suite qu'on parle d'un pointeur.

  9. #9
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Bof ... c'est simplement parce qu'on voit NULL depuis nos débuts en C/C++ ... Mais sinon tu peux mettre ton propre define

  10. #10
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    Citation Envoyé par Alp
    Bof ... c'est simplement parce qu'on voit NULL depuis nos débuts en C/C++ ... Mais sinon tu peux mettre ton propre define
    ...

    NULL permet de lire un code du 1er coup d'oeil. Si tu mets 0 et que quelqu'un passe derrière toi, c'est moins lisible que NULL.

    0 ? est-ce un entier, un pointeur, autre chose ?

Discussions similaires

  1. [Reflection] Instancier un objet
    Par bl@st dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 28/10/2008, 11h09
  2. [POO] Instancier un objet avec le nom de la classe
    Par shinchun dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2006, 13h44
  3. [JAR] instancier une Image contenue dans un jar
    Par celine31 dans le forum Général Java
    Réponses: 3
    Dernier message: 03/04/2005, 15h55
  4. [Débutant(e)]servlet qui instancie une classe personelle
    Par NiBicUs dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 08/02/2005, 12h00
  5. [VB.NET] Instanciation objet (sur class perso.)
    Par DaxTaz dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/05/2004, 11h07

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