¿Hay un equivalente de las propiedades de Python en C ++? ¿O sería mejor hacerlo usando getters y setters?

5
Jim Jeffries 18 ago. 2011 a las 13:27

3 respuestas

La mejor respuesta

Sí, getter y setters explícitos serían la construcción más cercana en C ++.

11
Diego Sevilla 18 ago. 2011 a las 09:30

En C ++ estás llamando a una función miembro o estás accediendo a un miembro de datos. Las propiedades de Python son esencialmente una forma de hacer lo primero usando la sintaxis de lo último y no hay una manera sensata de hacerlo en C ++.

En teoría, podrías hackear algo con una macro, #define looks_like_data really_a_function(), pero no sería bonito. O sensato La única razón necesaria para hacer que una función se parezca a los datos es mantener la compatibilidad con el antiguo código de llamada de cuando solía ser datos. Pero en C ++ esto no le dará compatibilidad binaria, y ni siquiera le dará realmente compatibilidad de fuente dado que la macro romperá el código de llamada que ya usa el nombre looks_like_data para otra cosa en otro contexto. Entonces no hay mucho punto.

Otra cosa que podría hacer es crear un miembro de datos real que actúe como un proxy para el tipo "lógico" de los datos:

struct Proxy {
    Foo *foo;
    Proxy(Foo *foo) : foo(foo) { }
    operator int() const {
        // getter code goes here,
        // use (const Foo*)foo rather than foo
    }
    Proxy &operator=(int a) {
       // setter code goes here
    }
    // optionally also implement boilerplate +=, -=, etc.
};

struct Foo {
    // optionally 
    // friend class Proxy;
    Proxy looks_like_data;
    Foo() : looks_like_data(this) { }
};

Esto es casi, pero no del todo, sensato. El uso de una conversión implícita still rompe la compatibilidad de la fuente, porque hay una regla de que solo puede haber una conversión implícita definida por el usuario en una cadena, por lo que si una persona que llama ha escrito el código cuando looks_like_data realmente era un int, y su código convierte implícitamente que int en Bar, luego, una vez que looks_like_data se convierte en Proxy ya no se convertirá implícitamente en {{X6 }} y has roto su código de todos modos.

Entonces, después de todo eso, es mejor usar las funciones getter / setter de su clase realmente necesita algo que se parezca a una propiedad de lectura / escritura.

11
Steve Jessop 18 ago. 2011 a las 10:01

No hay propiedades en C ++ estándar. Sin embargo, si está desarrollando en la plataforma Microsoft, puede usar su extensión de idioma:

http://msdn.microsoft.com/en-us/library/yhfk0thd.aspx

4
TeaWolf 18 ago. 2011 a las 09:33