Ver Mensaje Individual
  #3 (permalink)  
Antiguo 26/08/2010, 17:24
fightmx
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 9 meses
Puntos: 22
Respuesta: Uso del . en c++

La condición es simple, solo puedes llamar a funcion1 o funcion2 a través de un objeto de tipo "clase".

En este caso:
Código:
pa.funcion1(10,10).funcion1(10,10).funcion2(2).funcion2(3).funcion1(5,5);
pa.funcion1(10, 10) retorna una referencia al objeto "pa" por lo que a través de dicho valor de retorno puedes volver a llamar a funcion1 o funcion2, esto es:

Código:
pa.funcion1(10,10).funcion1(10,10)
Lo cual nuevamente retorna una referencia a "pa", en el caso de llamar a funcion2 el valor de retorno es una copia de "pa" pero este sigue siendo un objeto de tipo "clase", en fin puedes seguir asi cuantas veces quieras.

Prueba la siguiente modificación al código, espero te quede más claro.

Código C++:
Ver original
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6.  
  7. class clase
  8. {
  9.     float a,c;
  10.     string name;
  11.  
  12. public:
  13.     clase(int = 0, int = 0);
  14.     clase & funcion1(int,int);
  15.     clase funcion2(int);
  16.     clase(string s):name(s), a(0), c(0){}
  17.     clase(const clase& cl){
  18.         a = cl.a;
  19.         c = cl.c;
  20.         name = cl.name + "Cpy";
  21.     }
  22.     friend ostream & operator<<(ostream &, const clase &);
  23. };
  24.  
  25.  
  26.  
  27. clase::clase(int a_, int c_) : a(a_), c(c_) {}
  28.  
  29. clase & clase::funcion1(int i, int j)
  30. {
  31.     cout << name << ".funcion1(" << i << "," << j << ")";
  32.     a += i;
  33.     c += j;
  34.  
  35.     cout << " ... now " << name << " is " << *this;
  36.     cout << " ... return " << name << "&" << endl;
  37.     return *this;
  38. }
  39.  
  40. clase clase::funcion2(int x)
  41. {
  42.     cout  <<  name << ".funcion2(" << x << ")";
  43.     a *= x;
  44.     c *= x;
  45.  
  46.     cout << " ... now " << name << " is " << *this;
  47.     cout << " ... return " << name << "Cpy" << endl;
  48.     return *this;
  49. }
  50.  
  51. ostream & operator<<(ostream & os, const clase & clas)
  52. {
  53.     os << "(" << clas.a << "," << clas.c << ")";
  54.     return os;
  55. }
  56.  
  57. int main()
  58. {
  59.  
  60.     clase pa("pa"), pb("pb"),a("a"),b("b");
  61.  
  62.     pb = pa.funcion1(10,10).funcion1(10,10).funcion2(2).funcion2(3).funcion1(5,5);
  63.     cout << endl;
  64.     b = a.funcion2(3).funcion1(5,5);
  65.     cout << endl;
  66.  
  67.     cout << "pa = " << pa << endl;
  68.     cout << "pb = " << pb << endl;
  69.  
  70.     cout << "a  = " << a << endl;
  71.     cout << "b  = " << b << endl;
  72.  
  73.     return 0;
  74. }

Cita:
El tema que debes de buscar en la red "sobrecarga de operadores en c++"
Es buena la sugerencia de margarito pero en este caso solo es cuestión del tipo de retorno en las funciones.

saludos.