Paramétre par defaut c++ et donnés membre

Résolu/Fermé
2149chakala - 10 nov. 2010 à 17:48
mamiemando Messages postés 33333 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 31 octobre 2024 - 12 nov. 2010 à 12:47
Bonjour,
Est il possible de definir une donné membre en tant que par paramétre par defaut dans une fonction membre?
j'ai essayer le compilateur m'indique que ce n'est pas autoriser ,que faire ?


3 réponses

mamiemando Messages postés 33333 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 31 octobre 2024 7 800
10 nov. 2010 à 18:20
Effectivement ceci ne marchera pas :

#include <iostream>

class MaClasse{
    private:
        int membre;

    public:
        MaClasse(int membre0 = 0):
            membre(membre0)
        {}

        inline void maMethode(int x = this->membre){
            std::cout << x << std::endl;
        }
};

int main(){
    MaClasse m;
    m.maMethode();
    m.maMethode(5);
    return 0;
}


Voici une manière de s'en sortir

#include <iostream>

class MaClasse{
    private:
        int membre;

    public:
        MaClasse(int membre0 = 0):
            membre(membre0)
        {}

        inline void maMethode(int x){
            std::cout << x << std::endl;
        }

        inline void maMethode(){
            maMethode(membre);
        }
};

int main(){
    MaClasse m;
    m.maMethode();
    m.maMethode(5);
    return 0;
}


Bonne chance
1
2149chakala
10 nov. 2010 à 20:51
oui merci ,utiliser la surcharge j'y avait pas penser ça m'a en tous cas beaucoup aider mais je suis toujours preneur d'autre solutions.
0
mamiemando Messages postés 33333 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 31 octobre 2024 7 800
12 nov. 2010 à 12:47
Je doute qu'il y en ait avec une méthode, car le résultat renvoyé par une méthode ne peut être résolu à la compilation, et c'est la raison pour laquelle ton compilateur refuse cette syntaxe. Concrètement écrire :

void f(int x = 2){
  return x;
}


... compile deux fonctions :

void f(int x){
  return x;
}

void f(){
  return 2;
}


La seule manière de s'en sortir pour injecter du code comme tu voudrais le faire serait que ta fonction f soit une macro (#define f....) qui sera évaluée par le précompilateur. Beaucoup plus compliqué, moins élégant, moins pratique et assez injustifié je trouve.
0