Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Uso del . en c++

Estas en el tema de Uso del . en c++ en el foro de C/C++ en Foros del Web. Acabo de ver algo y que no acabo de entender. He buscado por la red y no he encontrado nada que me haya convencido del ...
  #1 (permalink)  
Antiguo 26/08/2010, 12:38
 
Fecha de Ingreso: agosto-2010
Mensajes: 8
Antigüedad: 14 años, 3 meses
Puntos: 0
Uso del . en c++

Acabo de ver algo y que no acabo de entender. He buscado por la red y no he encontrado nada que me haya convencido del siguiente problema que tengo. Fijaros, he simplificado mi estructura a un ejemplo simple:

Código C:
Ver original
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5.  
  6. class clase
  7. {
  8.     float a,c;
  9.     public:
  10.         clase(int = 0, int = 0);
  11.         clase & funcion1(int,int);
  12.         clase funcion2(int);
  13.         friend ostream & operator<<(ostream &, const clase &);
  14. };
  15.  
  16. clase::clase(int a_, int c_) : a(a_), c(c_) {}
  17.  
  18. clase & clase::funcion1(int i, int j)
  19. {
  20.     a += i;
  21.     c += j;
  22.     return *this;
  23. }
  24.  
  25. clase clase::funcion2(int x)
  26. {
  27.     a *= x;
  28.     c *= x;
  29.     return *this;
  30. }
  31.  
  32. ostream & operator<<(ostream & os, const clase & clas)
  33. {
  34.     os << "(" << clas.a << "," << clas.c << ")";
  35.     return os;
  36. }
  37.  
  38. int main()
  39. {
  40.  
  41.     clase pa, pb,a,b;
  42.  
  43.     [I][B]pb = pa.funcion1(10,10).funcion1(10,10).funcion2(2).funcion2(3).funcion1(5,5);[/B][/I]
  44.  
  45.     cout << pa << endl;
  46.     cout << pb << endl;
  47.    
  48.     return 0;
  49. }

Está claro que las funciones 1 y 2 están puestas para ir con cuidado, pero mi pregunta se refiere al operador . (se dice así?). Es decir, ¿que condiciones se tienen que dar para construir una sentencia de este tipo? ¿Cómo se lee esa linea?

El resultado que da el programa es (40,40) y (125,125)
En cambio si pongo esto:

Código:
b = a.funcion2(3).funcion1(5,5);
el resultado en pantalla es el siguiente:

(0,0) y (5,5)

Gracias.
  #2 (permalink)  
Antiguo 26/08/2010, 14:34
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 9 meses
Puntos: 1
Respuesta: Uso del . en c++

El tema que debes de buscar en la red "sobrecarga de operadores en c++"
  #3 (permalink)  
Antiguo 26/08/2010, 17:24
 
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.
  #4 (permalink)  
Antiguo 29/08/2010, 20:15
 
Fecha de Ingreso: mayo-2008
Ubicación: Chile
Mensajes: 189
Antigüedad: 16 años, 6 meses
Puntos: 3
Respuesta: Uso del . en c++

te le explico de una forma menos precisa pero tal vez mas facil de captar:
el punto(.) sirve para accder a algo de una estructura o clase(si usas punteros en vez de . usas ->),
por ejemplo tengo la estructura o clase Empleado, y este tiene int sueldo y char nombre[20].
para accder al empleado podria hacerse algo asi:
Empleado empleados[10];//crea un array para almacenar 10 empleados

empleados[0].sueldo = 5000;
empleados[0].nombre = ("Carlos");

Tambien puedes acceder a funciones,
por ejemplo:
empleados[0].set_name("carlos");
o cout << empleados[0].getname()

etc, si quieres ser un buen programador es fundamental que lo entiendas(es mejor que lo entiendas antes de meterte con sobrecarga de operadores)
__________________
si tienes entre 18 y 20 años... entonces tienes 19 años xD

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:30.