2012-04-19 15 views
5

me gustaría definir algunas propiedades como:letra mayúscula usando C++ preprocesador (x -> getX/setX)

#define property(T, x) T x; T get ## x(); void set ## x (T value); 

class foo { 
public: 
    property(int, count); 
    property(float, size); 
} 

pero me gustaría métodos que se llamará getCount/setCount y no GetCount/setcount.

+2

Eso no es posible. Sin embargo, podría cambiar su macro: 'propiedad (int, count, Count)' (o 'property (int, c, C, ount)' para minimizar la duplicación (no lo haga, era una broma)) – Shahbaz

+1

This isn Java. En el estilo aceptado de C++, las funciones deben llamarse 'get_x()' y 'set_x()' (excepto que la longitud o el conteo deben llamarse 'size()' y 'resize()'). –

+3

Si, como sugiere su macro, su variable es pública, ¿para qué preocuparse por los usuarios? – Nick

Respuesta

3

De ninguna manera (que yo sepa) para hacer esto con el pre-procesador C. Sugeriría como compromiso, elegir un guión bajo y usar get_count(), que se lee fácilmente. Otras alternativas:

  • Si realmente desea seguir con un pre-procesador, podría investigar usando m4 como primer paso. Definitivamente es posible con m4 ya que he hecho algo muy similar. Dicho esto, esto parece un poco complicado para lo que quieres lograr.
  • Agregue un parámetro extra para obtener #define property(T, x, name) que le permite especificar el nombre por separado. Es más flexible, pero de nuevo probablemente no sea lo que quieres.
  • Si realmente es solo la tarea de crear los accessors/mutators, hay muchos IDEs y generadores de código que lo harán por usted o podría escribir algo de shell/Python/Perl para eliminar esto como uno muy fácilmente .

Dos observaciones finales: Aunque pueda parecer más eficiente para escribir de esta manera, recuerde que cualquier persona mantener su código puede también hacer una búsqueda de setCount() y no lo encuentra, que será un desperdicio de tiempo hasta que descifrar lo que' Yo hice. Es decir. desde una perspectiva de mantenimiento de código, mantenerlo simple. En segundo lugar, es una buena práctica denotar macros en mayúsculas, ya que de esa manera se identifican fácilmente como tales. De nuevo, esto realmente ayuda cuando estás manteniendo el código.

5

Como dice el comentario, no se puede hacer eso. El preprocesador no hace ese tipo de cosas.

De modo que o bien usted sigue lo que @Shahbaz dijo en el primer comentario, o hace algo como esto que le da get y un conjunto de formularios get_count y set_count.

#define property(T, x) private : T m_## x; \ 
public : T get_## x() { return m_## x;} \ 
void set_## x (T value) { m_## x = value; } 

class foo { 
public: 
    property(int, count); 
    property(float, size); 
}; 

int main() { 
     foo f; 
     f.set_count(10); 
     std::cout << f.get_count() << std::endl; 
     return 0; 
} 

Quick demo at ideone

Nótese que la variable se declara en la sección private y su nombre es m_count, y las funciones son definidas (no sólo declarada) en la sección public.

O bien, puede pasar Count en lugar de count en la macro como:

property(int, Count); 

Si es así, entonces se podría crear la variable como m_Count y funciona como getCount y setCount. Eso es lo más cercano a lo que quieres.

Cuestiones relacionadas