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 :

reference anomyme en parametre de fonction


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 reference anomyme en parametre de fonction
    Salut,

    Y a t il une astuce pour faire fonctionner le code suivant sans passer par une variable temporaire, donc en gardant la variable temporaire anomyme :


    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
    #include <iostream>
    #include <string>
     
    using namespace std;
     
    void takeRef( string & ref);
     
    int main() {
     
        //pas de temp ?
        //string temp("hello");
     
        takeRef( static_cast<string &>(string("Hello")) );  // marche pas
        takeRef( string("Hello") );                         // marche pas
     
    }
     
    void takeRef( string & ref)
    {
        cout << ref << endl;
    }

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par d�faut
    et avec un const, �a �choue aussi?
    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.

  3. #3
    Membre averti
    Inscrit en
    D�cembre 2005
    Messages
    17
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2005
    Messages : 17
    Par d�faut
    ca passe en mettant takeRef( const string % ref );
    et en castant avec le const.

    C est pas tt a fait ce que je veux.
    J ai simplifie dans cet exemple et le string et en realite une autre classe.

  4. #4
    Membre averti
    Inscrit en
    D�cembre 2005
    Messages
    17
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2005
    Messages : 17
    Par d�faut
    Voici un exemple qui represente un peut plus ma problematique (sans les string).
    admetons que les class "iterat" et "aClass" ne soient pas a moi :

    using namespace std;
    class iterat
    {
    public:
    int num;
    iterat():num(0){}
    iterat(int x):num(x){}
    };

    class aClass
    {
    iterat it;
    public:
    aClass(){}
    aClass(int x):it(x){}

    iterat giveIter(){return it;}
    };

    void takeRef( iterat & ref );

    int main() {

    aClass obj;

    //pas de temp ?
    iterat lclIt = obj.giveIter();
    takeRef( lclIt ); // OK, mais passage par une variable locale

    takeRef( static_cast< iterat &>( obj.giveIter() )); // marche pas
    takeRef( obj.giveIter() ); // marche pas

    }

    void takeRef( iterat & ref)
    {
    cout << ref.num << endl;
    }

    et voici l erreur g++ 4.0.2:

    In function ‘int main()’:
    42: error: invalid static_cast from type ‘iterat’ to type ‘iterat&’
    43: error: invalid initialization of non-const reference of type ‘iterat&’ from a temporary of type ‘iterat’
    32: error: in passing argument 1 of ‘void takeRef(iterat&)’

  5. #5
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

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

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Si iterat prend en param�tre une r�f�rence non constante, c'est qu'il veut modifier ce param�tre. Si tu lui passe une variable temporaire, tu n'auras aucun moyen d'acc�der � cette valeur modifi�e, c'est pourquoi le compilateur interdit ce genre de code, qui est souvent signe d'erreur.

    En l'occurence, ton probl�me est que la fonction takeRef est mal d�finie : Si elle n'a pas pour r�le de modifier son argument, pourquoi le prendre par r�f�rence non constante ?
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  6. #6
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par d�faut
    Citation Envoy� par GCC
    invalid initialization of non-const reference of type �iterat&� from a temporary of type �iterat�
    En quoi l'ajout de const n'est-il pas "tout � fait ce que tu veux" ?
    Il est normal que le C++ n'accepte pas une r�f�rence non-constante sur un objet temporaire: les modifications seraient perdues de toute fa�on, ce serait plus une source de bugs qu'autre chose...

    PS: Je viens de tester: Avec const, �a marche avec et sans cast:
    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
    45
    46
    47
    48
    49
    #include <iostream>
    using namespace std;
     
    //--- classes ---
    class iterat
    {
    public:
    	int num;
    	iterat():num(0){}
    	iterat(int x):num(x){}
    };
     
    class aClass
    {
    	iterat it;
    public:
    	aClass(){}
    	aClass(int x):it(x){}
     
    	iterat giveIter(){return it;}
    };
     
    //--- Fonctions ---
    void takeRef( iterat const & ref );
     
     
    /* M A I N
       ------- */
    int main()
    {
    aClass obj;
     
    //pas de temp ?
    iterat lclIt = obj.giveIter();
    takeRef( lclIt ); // OK, mais passage par une variable locale
     
    takeRef( static_cast< iterat const &>( obj.giveIter() )); //ça marche
    takeRef( obj.giveIter() ); //ça marche aussi
     
    return 0;
    }
     
     
    /* Fonction test utilisant une référence
       ------------------------------------- */
    void takeRef( iterat const & ref)
    {
    cout << ref.num << endl;
    }
    Edit: Ah, post crois�.
    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.

  7. #7
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par M�dinoc
    Il est normal que le C++ n'accepte pas une r�f�rence non-constante sur un objet temporaire: les modifications seraient perdues de toute fa�on, ce serait plus une source de bugs qu'autre chose...
    Je comprends bien la logique, mais pourquoi n'est-elle pas pouss�e jusqu'au bout? Si on a
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct s {
      void f(); // non const
     
    s g();
    on peut faire
    Code:
    g().f();
    mais pas
    };
     
    void f(s&);
     
    s g();
    on peut fairemais paset j'ai du mal � voir pourquoi le premier serait plus s�r que le second. (A noter qu'il fut un temps o� le second �tait admis; certain compilateur que j'utilise ne mets d'ailleurs qu'un warning).

  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
    Ok merci,
    Je comprend que mon temporaire anonyme soit un const,

    Mais maintenant imaginons que cet iterateur iterat (temporaire) dans takeRef() manipule un autre object, dont il a acces en interne, qui lui est permanent et ne serra pas detruit avec l iterateur temporaire a la sortie de la fonction takeRef().

    De plus takeRef() veux effectuer des operations d'ecritures sur cet object permanent et le modifier. L iterateur iterat doit-il rester "const" pour cela ?

    Sinon comment faire ?

Discussions similaires

  1. R�ponses: 3
    Dernier message: 03/03/2006, 17h09
  2. [VBA-E]passage de parametre � une fonction
    Par DonKnacki dans le forum Macros et VBA Excel
    R�ponses: 7
    Dernier message: 02/02/2006, 17h51
  3. Parametre de fonction
    Par yosh� dans le forum Linux
    R�ponses: 1
    Dernier message: 09/01/2006, 10h46
  4. parametre et fonction
    Par jeff_! dans le forum G�n�ral JavaScript
    R�ponses: 5
    Dernier message: 19/12/2005, 09h55
  5. R�ponses: 13
    Dernier message: 13/10/2005, 16h03

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