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 :

Création conditionnelle d'un objet via un if/else


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Par défaut Création conditionnelle d'un objet via un if/else
    Bonjour,

    J'ai un pitit problème : j'aimerais créer localement un objet avec un constructeur ou l'autre selon l'état d'un booléen (ici steady_state_used) mais lorsque j'utilise la structure ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(!steady_state_used) freevol_etasta freevol_dlg(this, &d_transf);
    else freevol_etasta freevol_dlg(this, &d_transf, &deps1, &deps2, &dsig1, &dsig2);
    mon compilo me jette en disant : "freevol_dlg undeclared, first use of this function" : est-il possible de créer un objet dans un if ou un else ???

    Merci

  2. #2
    Membre éprouvé
    Lycéen
    Inscrit en
    Juillet 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2007
    Messages : 148
    Par défaut
    Si je me souviens bien, quand tu crée quelque chose dans un bloc (une variable, une instance, etc.), il est détruit à la fin du bloc, donc ici à la fin du if-else.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Par défaut
    argh ! tu as raison, il me semble bien... merci Je vais contourner le problème de façon pas trop élégante, mais tant pis

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 637
    Par défaut
    Salut,

    Cela s'appelle la "portée"...

    Le problème est encore pire, car, le code "idéalement écrit" est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(!steady_state_used) 
    {
        freevol_etasta freevol_dlg(this, &d_transf);
    }
    else 
    {
        freevol_etasta freevol_dlg(this, &d_transf, &deps1, &deps2, &dsig1, &dsig2);
    }
    et là, on se rend compte qu'il y a deux blocs séparés: un pour le "if" et un pour le "else"

    Comme on "sort" du bloc (et donc de la porté du if) dés qu'on atteint l'accolade fermante avant le else, et qu'on sort de celle du else dés qu'on atteint l'accolade fermante, ce code n'a, en définitive que l'effet de créer un objet et de le détruire aussi sec
    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

  5. #5
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Si tu dois construire l'objet pour le renvoyer et t'en servir dans ton application, utilise new.

    Si l'objet n'est destiné qu'à être utiliser dans cette fonction, utilise new avec std::auto_ptr.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 637
    Par défaut
    Une autre solution est, peut etre, de passer par l'opérateur ternaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    freevol_etasta freevol_dlg(this,
        ( steady_state_used ?
            &d_transf, &deps1, &deps2, &dsig1, &dsig2 :
            &d_transf));
    (solution non testée)

    *Normalement* la déclaration de freevol_dlg étant dans la portée "générale" de la fonction, cela devrait pouvoir passer.

    Evidemment, cela nécessitera peut etre un petit commentaire (car, du point de vue de la lisibilité )
    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

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

Discussions similaires

  1. Création d'un objet via formulaire
    Par Shin0bi182 dans le forum Java EE
    Réponses: 0
    Dernier message: 26/03/2011, 19h03
  2. [POO] création d'objet via une fabrique de classe
    Par flash_math dans le forum Langage
    Réponses: 2
    Dernier message: 10/11/2007, 09h15
  3. création d'une vue objet
    Par dams78 dans le forum Oracle
    Réponses: 5
    Dernier message: 01/05/2006, 10h36
  4. [Conception] Création d'un Mailing List via une BDD
    Par Matmax dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 12/04/2006, 14h23
  5. [VC++6]Créations de fenêtres et objets GDI
    Par Yoyo@ dans le forum MFC
    Réponses: 20
    Dernier message: 10/07/2005, 16h12

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