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 :

Un objet null


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Par défaut Un objet null
    Bonjour

    J'ai un peu cherché mais je ne trouve pas mon bonheur.

    J'apprends le C++ natif à l'école en ce moment, et dans le projet que je dois créer, j'ai une méthode qui selon qu'elle aie réussi ou non, me renvoie un objet instancié ou null.

    Le problème, c'est qu'en c++ je ne sais pas comment avoir l'objet null.
    Je programme en Java depuis un moment donc ma notion d'objet null c'est par exemple

    En Java, après cette instruction "obj" est null, il faut un appel explicite au constructeur avec un "new" pour instancier l'objet.

    En c++, après cette instruction "obj" n'est pas null, le constructeur par défaut de la classe a été appelé, l'objet est déjà instancié.

    Et donc moi qui ai l'habitude de pouvoir faire ce test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(obj == null)
    { 
        ... 
    }
    En c++ je ne vois que l'alternative de tester la valeur d'un des attribut de mon objet pour savoir s'il a été initialisé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(obj.getAttribut() == valeur)
    {
        ...
    }
    mais je n'aime pas trop ce procédé.

    Si j'utilise un pointeur (pour tester la valeur NULL), je suis embêté par le fait que les objets déclarés (et instanciés) dans une méthode sont détruit une fois la méthode exécutée. Retourner un pointeur vers cet objet cause une erreur à l'exécution (violation d'accès mémoire).

    Donc me voilà un peu coincé.
    Je n'ai pas encore la philosophie C++ donc ma façon de raisonné n'est peut-être pas la bonne.

    Je m'en remets à vous pour m'éclairer sur la question

    merci d'avance

  2. #2
    Membre chevronné
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Par défaut
    Bonjour,

    Tout d'abord, je te conseille la lecture d'un bon petit cours C++ en partant de l'hypothèque que tout ce que tu as appris en Java ne pourra s'appliquer au C++ !
    http://bruce-eckel.developpez.com/li...on/ticpp2vol1/


    Ensuite, pour une réponse rapide, sache qu'en Java tout est pointeur, sauf que la syntaxe du langage le cache. Également, en Java tous les objets sont créés dynamiquement (ce qui n'est cette fois-ci pas caché par la syntaxe, vu que tu tapes expressément « new »).
    Tu as effectivement raison en disant qu'un objet créé statiquement est détruit dès la sortie de la fonction. J'irai même plus loin en disant que tout objet créé statiquement est détruit dès qu'il sort de sa portée, quelle que soit la forme de cette portée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main()
    {
        {
            my_class c;
        }
        //c n'existe plus !
     
        //reste du programme
    }
    Pour que l'objet existe encore après la fin de sa portée, il faut qu'il soit créé dynamiquement (comme en Java) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my_class* c = new my_class();
    Alors, tu pourras faire retourner à ta fonction un pointeur cette fois-ci valide.

    Pour avoir un pointeur null, il existe effectivement la macro NULL, mais il est plus adapté d'utiliser 0. Le prochain standard défini le mot-clé nullptr, mais on y est pas encore !
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Par défaut
    Si tu veux pouvoir retourner un pointeur d'un objet créé au sein de ta méthode, il te faut créer l'objet dynamiquement dans la méthode et non statiquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    MyObject* myMethod()
    {
        MyObject* myObjetPtr = NULL;
     
        bool create = false;
     
        //... on set create si on souhaite créer l'objet
     
        if (create)
            myObjectPtr = new MyObject();
     
        return myObjectPtr;
    }
    Mais attention car ce genre de pratique peut entrainer une fuite mémoire. Il ne faut pas oublier de libérer la mémoire sur le pointeur avec un delete lorsque l'objet n'est plus utilisé.

    En général les developpeur C++ issue du Java on tres souvent tendance a abuser de l'allocation dynamique. Si tu as un autre moyen de le faire, utilise le, ca eliminera des risque de fuite mémoire eventuel.
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Par défaut
    Bonjour

    Merci d'avoir répondu si vite.

    C'est très clair, merci à vous 2.

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Les objets en Java correspondent à peu prés aux pointeurs en C++, donc tu peux faire ce que tu faisait en Java avec des pointeurs en C++.

    Mais c'est pas forcement une bonne idée, on ne programme pas en C++ comme on programme en Java, notamment on utilise rarement des pointeurs.

    Pourquoi vouloir savoir si un objet est initialisé ? En C++ si un objet est défini, il a forcement été initialisé (c'est le principe des constructeurs).

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Par défaut
    Citation Envoyé par Sylvain Togni Voir le message
    [...]
    Pourquoi vouloir savoir si un objet est initialisé ? En C++ si un objet est défini, il a forcement été initialisé (c'est le principe des constructeurs).
    C'est justement cette notion que je n'arrive pas à intégré.

    Existe-t-il un moyen autre que de tester la valeur d'un attribut pour savoir comment mon objet a été instancié.

    par exemple si j'ai ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyObject EssayeDeCreer(int param1, int param2)
    Si mes paramètes "param1" et "param2" sont bons, la fonction me revoit un objet correcte, s'ils ne sont pas bons, la fonction me revoit un objet incorrecte (en java, si mes paramètres ne sont pas bons, j'aurais renvoyé null).

    Et dans le code j'aurais quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    MyObject obj;
    // L'utilisateur entre les valeurs de param1 et param2
    obj = EssayeDeCreer(param1, param2);
    while(obj == null)
    {
        // signaler à l'utilisateur que les paramètres sont incorrectes
        // réobtenir les paramètres
        obj = EssayeDeCreer(param1, param2);
    }
    Quelle est la manière C++ de faire ce genre de chose ?

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Par défaut
    Tu peux utiliser les exceptions
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ou bien, comme vu plus haut, retourner un pointeur vers l'objet créé ou non.
    Mais je conseille l'exception, qui est la méthode "normale" pour signaler une erreur dans un constructeur d'objet ou assimilé...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Si tu es plus à laisse avec les pointeur, tu devrais utiliser les smart_ptr.
    http://loic-joly.developpez.com/tuto...mart-pointers/

    Sinon tu peut mettre un pointeur à 0. Ce qui correspond en gros à ton null.
    Mais ce la va t'obliger à gérer de mémoire à la main.

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Par défaut
    Merci pour toutes ces réponses

    Comme je n'excelle pas dans l'utilisation des pointeur et de la gestion mémoire à la main, je vais m'orienter vers les exceptions

    Il va juste falloir que j'apprenne comment elles marchent en C++
    Ce qui au fond est une bonne chose puisse que je suis justement en train d'apprendre le langage

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

Discussions similaires

  1. objet null en ncomparaison
    Par root76 dans le forum Langage
    Réponses: 5
    Dernier message: 19/04/2007, 15h03
  2. [jsp] usebean d'un objet null
    Par GLDavid dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 05/07/2006, 18h12
  3. Réponses: 4
    Dernier message: 18/02/2006, 16h48
  4. [Language]Type d'un objet null
    Par Calambo dans le forum Langage
    Réponses: 8
    Dernier message: 26/04/2005, 10h06
  5. Formulaire - lien JS - objet Null ou pas objet...
    Par Romalafrite dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/10/2004, 14h08

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