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 :

Déclaration de variable dans la condition d'un if


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Déclaration de variable dans la condition d'un if
    Bonjour.

    Si j'ai les classes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      class Base { public: virtual ~Base(); [...] };
      class One : public Base { [...] };
      class Two : public Base { [...] };
    Est-ce que le code suivant est du C++ standard? (c'est à dire, est-ce que déclarer une variable dans le if est valide?). Il semblerait que ça marche en VC6.

    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
     
      void aFunction( const Base & object )
      {
        if (const One* pOne = dynamic_cast<const One*>(&Object))
        {
          pOne->doSomething();
        }
        else if (const Two* pTwo = dynamic_cast<const Two*>(&Object))
        {
          pTwo->doSomethingElse();
        }
        else
        {
          // No use of pOne or pTwo.  
        }
      }
    C'est pour éviter de faire 2 fois le dynamic_cast, une fois dans la condition du if, l'autre dans le traitement.

    Merci.

  2. #2
    Membre averti Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Points : 414
    Points
    414
    Par défaut
    Non, je pense pas, la déclaration d'une variable dans la condiftion n'est pas autorisé dans aucun langage de programmation.

    il faut passé par une déclaration prédéfinie au par avant, pour qu'elle as une valeur, et puis faire la condition.

  3. #3
    Membre éclairé

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Si si, c'est tout à fait légal.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par cmoibal Voir le message
    Non, je ne pense pas, la déclaration d'une variable dans la condiftion n'est pas autorisé dans aucun langage de programmation.

    il faut passé par une déclaration prédéfinie au par avant, pour qu'elle as une valeur, et puis faire la condition.
    C'est à priori ce à quoi je m'attendais. Néanmoins, j'ai constaté que VC6 accepte sans problème la syntaxe, et qu'en plus le comportement est celui auquel on peut s'attendre.

    Ma question est de savoir si c'est permis par le langage ou est-ce propre a VC6. (je n'ai pas la norme sous la main, ni d'autres compilateurs)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Sylvain Togni Voir le message
    Si si, c'est tout à fait légal.
    Et la portée est le corps du if et du else... un peu comme un index de boucle dans un for.

    Je testerais ce soir sur gcc pour voir.

    Merci à tous.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Salut,

    C'est tout à fait légal, quant à savoir si c'est une bonne idée... (surtout sur base d'un dynamic_cast )

    Dans l'exemple donné, pourquoi ne pas tout simplement utiliser une classe abstraite qui fournit l'interface commune aux deux classes

    Il est peut etre possible de trouver un terme qui permette justement de regrouper la signification des comportements de la classe One et celui de la classe Two, qui appellera, par polymorphisme One->doSomething et Two->doSomethingElse, selon le cas

    Cela prendrait, tout simplement, la forme de
    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
    class Base
    {
        public:
            /*...*/
            virtual void genericDoSomething()=0;
    };
    class One : public Base
    {
        public:
            virtual genericDoSomething(){doSomething();}
        /*la visibilité reste du pur choix de l'utilisateur selon les besoins */
            void doSomething()
            {
                /*...*/
            }
    };
    class Two : public Base
    {
        public:
            virtual genericDoSomething(){doSomethingElse();}
        /*la visibilité reste du pur choix de l'utilisateur selon les besoins */
            void doSomethingElse()
            {
                /*...*/
            }
    };
    (voire, carrément, de redéfinir le comportement directement dans genericDoSomething... )
    [EDIT]j'allais oublier: la fonction deviendrait alors, tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void aFunction(const Base* object)
    {
        object->genericDoSomething();
    }

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    C'est tout à fait légal, quant à savoir si c'est une bonne idée... (surtout sur base d'un dynamic_cast )

    Dans l'exemple donné, pourquoi ne pas tout simplement utiliser une classe abstraite qui fournit l'interface commune aux deux classes
    Oui, c'est bien évidemment ce qui pourrait être fait. Mais dans mon cas particulier, d'une part je ne maitrise pas (je ne peux pas modifier) l'arborescence Base/One/Two mais en plus les actions sur les classes dérivées n'ont rien a voir entre elles. C'est du code que je récupère en maintenance, donc, je fais avec.

    Ma question portait plus sur la légalité du code (pour ma culture générale, car ça fonctionne avec le compilo que j'utilise) que sur la conception, qui n'est pas sur ce coup là, des plus élégante.

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

Discussions similaires

  1. Déclaration de variables dans une procédure stockée
    Par jbrasselet dans le forum Développement
    Réponses: 5
    Dernier message: 16/02/2009, 09h00
  2. déclaration des variables dans une fonction
    Par kawther dans le forum Débuter
    Réponses: 4
    Dernier message: 22/10/2008, 01h17
  3. Réponses: 8
    Dernier message: 15/10/2008, 23h43
  4. Réponses: 8
    Dernier message: 03/11/2006, 15h55
  5. [Optimisation?] Déclaration de variable dans les boucles
    Par romaintaz dans le forum Langage
    Réponses: 5
    Dernier message: 11/08/2006, 16h08

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