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 :

parametrage par default avec des variables membres.


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 17
    Par défaut parametrage par default avec des variables membres.
    Bonjour,

    Est-il possible en C++ d'utiliser des variables membres d'une classe comme parametres par defaut pour une methode de cette meme classe.

    J'ai code le source suivant pour illustrer mon idee.
    Mon compilateur rale sur le code suivant en me suggerant de passer en static. Je prefere eviter cette solution.

    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
     
    class A
    {
        public :
            A(int , int );
            int val;
            int val2;
     
            void method(int arg = val, int arg2 = val2);
     
    };
     
    A::A(int _val, int _val2):val(_val),val2(_val2)
    {
    }
     
    void
    A::method(int arg, int arg2)
    {
        std::cout << arg << arg2 << std::endl;
        std::cout << val << val2 << std::endl;
    }
     
    int main() {
     
        A objA(42, 33);
     
        objA.method();
     
        return(EXIT_SUCCESS);
    }
    Sortie du compilateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    (pts/10):{549}$ g++ -Wall class_default_parameters.cpp
    class_default_parameters.cpp:15: error: invalid use of non-static data member ‘A::val’
    class_default_parameters.cpp:18: error: from this location
    class_default_parameters.cpp:16: error: invalid use of non-static data member ‘A::val2’
    class_default_parameters.cpp:18: error: from this location
    Merci.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Par défaut
    Il me semble bien que la norme impose que les valeurs affectées aux arguments par défaut soient des constantes.

    Donc, à priori, exit aussi les variables statiques.

  3. #3
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 68
    Par défaut
    Ceci ne fonctionerait il pas?

    Attention je n'ai pas compilé pour tester, je ne fais que proposer une solution qui me semble fonctionnerait.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    class A
    {
        public :
            A(int , int );
            int val;
            int val2;
     
            void method(int arg, int arg2);
            void method();
            void method(int arg);
    };
     
    A::A(int _val, int _val2):val(_val),val2(_val2)
    {
    }
     
    void
    A::method(int arg, int arg2)
    {
        std::cout << arg << arg2 << std::endl;
        std::cout << val << val2 << std::endl;
    }
     
    void
    A::method()
    {
        method(val, val2);
    }
     
    void
    A::method(int arg)
    {
        method(arg, val2);
    }
     
    int main() {
     
        A objA(42, 33);
     
        objA.method();
     
        return(EXIT_SUCCESS);
    }

  4. #4
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Ma question est, peut être qu'il y a une erreur de conception ?

    Pourquoi le faire ainsi ?

    Et c'est "logique" qu'on ne peut les passer en dynamique, car si je ne dis pas trop de bêtise , c'est le compilateur qui remplace à la volé les chiffres données par défaut en paramètre. Donc vu que val et val2 sont inconnus à la compilation il ne peut pas faire de substitution.


    PS: la méthode à capitN.flam devrait fonctionner

  5. #5
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    La réponse est simple : une valeur par défaut doit être constante !

  6. #6
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 17
    Par défaut
    La solution de capitN.flam doit fonctionner, c'est celle que j utilise actuellement.
    Je me demandais juste on pouvait faire cela au niveau du language avec les parametres par defaut.

    L'erreur de conception est possible.
    Mon idee est que je veux une methode qui prend et utilise des parametres en argumement si ils sont fournis, sinon elle utilise les parametres internes de la classe (definit dans le constructeur).

    Je pense que le probleme est resolu car comme le dit Patriarch24 si il a raison:
    "une valeur par défaut doit être constante"

    Merci.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Citation Envoyé par seb9999
    Mon idee est que je veux une methode qui prend et utilise des parametres en argumement si ils sont fournis, sinon elle utilise les parametres internes de la classe (definit dans le constructeur).
    Dans ce cas, ta solution me parait un peu compliquee. Quelque chose du genre
    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
     
    class C
    {
    public : 
        C(int val1, int val2);
     
        int val1() const;
        int val1(int valeur);
     
        int val2() const;
        int val2(int valeur);
     
        void f(); // utilise this->val1_ et this->val2_
    private :
        int val1_;
        int val2_;
    };
     
    int main()
    {
        C objet(42, 1095);
        objet.f();
     
        objet.val1(18);
        objet.val2(4012);
        objet.f();
    }
    me parait plus simple. Dans ton idee originale, la fonction fait un peu trop de choses, ici elle se contente d'utiliser l'etat courant de l'objet.

  8. #8
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 17
    Par défaut
    C'est aussi une autre solution, je saisis la logique.
    A choisir, dans mon contexte, je prefere fournir une interface avec une seule methode.
    Merci

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/11/2005, 12h03
  2. Remplir les cellules Excel avec des variables VB
    Par rupeni dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 21/11/2005, 09h31
  3. petit souci avec des variables avec des fonctions psql
    Par dust62 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/04/2005, 13h45
  4. paramétrer ADOConnection avec des variables
    Par ouckileou dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/04/2004, 08h11
  5. UPDATE avec des variables Delphi ...
    Par Kokito dans le forum Bases de données
    Réponses: 3
    Dernier message: 08/03/2004, 22h35

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