[C con Clase] estilo: Sobrecarga en funciones lectura escritura

Steven Davidson srd4121 en njit.edu
Vie Mar 6 19:19:20 CET 2009


Hola Vicente,

vicente lozano wrote:
> Hola!
> 
> Me gustaria saber que pensais vosotros sobre esto:
> 
> class punto {
>     public:
>         punto(int vx=0, int vy=0) : xv(vx), yv(vy) {}
>         const int x() { return xv; }
>         const int y() { return yv; }

Escribir 'const' aquí no es necesario. Lo que sí deberías hacer es 
escribir estas definiciones así:

int x() const  { return xv; }
int y() const  { return yv; }

Con esto, indicamos que las funciones son constantes que significa que 
éstas no tienen intención alguna de modificar el estado de este objeto.

>         void x(int valor) {xv=valor;}
>         void y(int valor) {yv=valor;}
>     private:
>         int xv;
>         int yv;
> };
> 
> Es mas que nada que conceptualmente yo creo que es normal llamar
> punto.x para saber una cordenada y punto.x(5) para cambiarla, pero no
> se si eso de sobrecargar una funcion para que una modifique el objeto
> y la otra solo lo lea es de buen estilo, puede crear algun problema
> de comprension mas adelante o esta desaconsejado o algo asi o esta
> bien.
> 
> Compilar y funcionar ya se que lo hace bien es una cuestion de estilo 
> mas que nada.
> 

A mí me parece bien hacerlo así. También podrías asignar valores de esta 
manera:

punto p(5,-1);

cout << p.x() << ',' << p.y() << endl;

p.x() = 5;
p.y() = 10;

Esto se puede hacer si aplicas los cambios que mencioné anteriormente. 
Al final, la clase quedaría así:

// Obtener - "getter"
int x() const  { return xv; }
int y() const  { return yv; }

// Asignar - "setter"
int &x() { return xv; }
int &y() { return yv; }

Con esto, también podríamos hacer lo siguiente:

cout << ++p.x() << endl;


Algunas bibliotecas y armazones (frameworks, en inglés) implementan el 
concepto de propiedades. El resultado es poder hacer lo siguiente:

punto p;

p.x = 5;
p.y = 10;

Sin embargo, estas asignaciones son seguras. Esto es porque declaran 
'xv' e 'yv' como objetos de una clase especial la cual sobrecarga el 
operador de asignación. Esto aparenta poder asignar directamente a los 
miembros privados.


Espero haber contribuido al tema.

Steven





Más información sobre la lista de distribución Cconclase