2009-10-25 6 views

Répondre

9

Pour cette syntaxe spécifique que vous auriez à retourner une référence

class Foo { 
public: 

    Foo& SetX(int x) { 
    /* whatever */ 
    return *this; 
    } 

    Foo& SetY(int y) { 
    /* whatever */ 
    return *this; 
    } 
}; 

post-scriptum Ou vous pouvez renvoyer une copie (Foo au lieu de Foo&). Il n'y a aucun moyen de dire ce dont vous avez besoin sans plus de détails, mais à en juger par le nom de la fonction (Set...) que vous avez utilisé dans votre exemple, vous avez probablement besoin d'un type de retour de référence.

3

Oui c'est possible. Un exemple de comon est la surcharge de l'opérateur, comme operator + =().

Par exemple, si vous avez une classe appelée ComplexNumber, et que vous voulez faire quelque chose comme a + b =, alors vous pouvez

ComplexNumber& operator+=(ComplexNumber& other){ 
    //add here 
    return *this; 
} 

Dans votre cas, vous pouvez utiliser.

Foo& setX(int x){ 
//yada yada yada 
return *this; 
} 
+3

Vous _really_ ne voulez pas le faire pour l 'opérateur + '- qui modifierait l'argument à la main gauche dans des expressions comme' a = b + c'. Ce n'est pas ce que l'on pourrait attendre :) – bdonlan

+0

Cela devrait être fait pour toutes les surcharges d'opérateurs d'affectation. –

+0

@bdnolan: Modifié à + = – Tom

2

Eh bien, vous pouvez retourner un objet de sa propre fonction pour les fonctions de la chaîne ainsi:

#include <iostream> 
class foo 
{ 
    public: 
     foo() {num = 0;} 
     // Returning a `foo` creates a new copy of the object each time... 
     // So returning a `foo&` returns a *reference* to this, and operates on 
     // the *same* object each time. 
     foo& Add(int n) 
     { 
      num += n; 
      std::cout << num << std::endl; 
      // If you actually DO need a pointer, 
      // change the return type and do not dereference `this` 
      return *this; 
     } 
    private: 
     int num; 
}; 

int main() 
{ 
    foo f; 
    f.Add(10).Add(5).Add(3); 
    return 0; 
} 

qui délivre en sortie:

$ ./a.out 
10 
15 
18 
+0

Cela ne fonctionne mieux que si le type de retour est foo & – jmucchiello

+0

Merci pour votre aide tout le monde :) – Sam

+0

@jmucchiello: Cela fonctionne * différemment * si le type de retour est 'foo &'. Donc ce n'est pas une question de «mieux», c'est une question de ce dont vous avez vraiment besoin. – AnT

0
#include <iostream> 

using namespace::std; 

class Print 
{ 
    public: 
     Print * hello(); 
     Print * goodbye(); 
     Print * newLine(); 
}; 

Print * Print::hello() 
{ 
    cout << "Hello"; 
    return this; 
} 
Print * Print::goodbye() 
{ 
    cout << "Goodbye"; 
    return this; 
} 
Print * Print::newLine() 
{ 
    cout << endl; 
    return this; 
} 

int main (void) 
{ 
    Print print; 
    print.hello()->newLine()->goodbye()->newLine(); 

    return 0; 
} 

Sortie:

Hello 
    Goodbye 
Questions connexes