Emilio Astarita, el 24 de abril a las 11:24 me escribiste:
> > Creo que el único lenguaje OO más o menos popular que no soporta esto es
> > Java (sé que, al menos, Pyton, PHP, Ruby, C++, C# y D lo soportan de una
> > forma u otra).
> > 
> 
> Pregunta ¿En C++ se haría con sobrecarga de operadores? Si es así, como
> se haría con los tipos básicos?

Haciendo una clase "proxy", va un ejemplo simplón pero funcional:

--------------------------------------------------------------------------
#include <iostream>

template <typename Type, typename Host, Type (Host::*Get)() const,
                void (Host::*Set)(const Type&)>
struct property
{
        Host& host;
        property(Host& host): host(host) {}
        // set
        property& operator=(const Type& x) { (host.*Set)(x); }
        // get
        operator Type() const { return (host.*Get)(); }
};

struct clase
{
        clase(): c(*this) {}
        int real_c;
        int get_c() const
        {
                std::cout << "obteniendo c\n";
                return real_c;
        }
        void set_c(const int& c)
        {
                std::cout << "seteando c\n";
                real_c = c;
        }
        property< int , clase, &clase::get_c, &clase::set_c > c;
};

int main()
{
        clase x;
        x.c = 1;
        std::cout << "valor = " << x.c << "\n";
        return 0;
}
--------------------------------------------------------------------------

Como bug evidente tiene que el tipo de retorno no puede ser por
referencia, por lo que no se pueden usar operadores que muten el tipo
"proxiado". Por ejemplo:
x.c++;
No va a tener en efecto en x, porque se va a modificar un temporal. Igual
esto no debería ser un impedimento, porque en general, si un getter
obtiene una referencia, ya rompiste todo posibilidad de cambiar la
implementación interna en un futuro si el atributo "real_c" deja de
existir (o si cambia a un tipo incopatible o algo así).

PD: Sí, advertí que era engorroso y rebuscado en C++ =)

PD: Va todo publico a propósito así sigue el flame ;)

-- 
Leandro Lucarella (luca) | Blog colectivo: http://www.mazziblog.com.ar/blog/
----------------------------------------------------------------------------
GPG Key: 5F5A8D05 (F8CD F9A7 BF00 5431 4145  104C 949E BFB6 5F5A 8D05)
----------------------------------------------------------------------------
<original> [Penis Uptime: 2days 13hrs 59mins 35secs]
<Yapa> viagra? :)
<original> yea, 20 pills
_______________________________________________
Lista de correo Programacion.
[email protected]
http://listas.fi.uba.ar/mailman/listinfo/programacion

Responder a