2011-07-26 15 views
6

A menudo me encuentro escribiendo clases muy simples en lugar de estructuras de estilo C. Por lo general se ven así:C++ Generar el constructor estándar

class A 
{ 
public: 
    type mA; 
    type mB; 
    ... 
    A(type mA,type mB,...) : mA(mA),mB(mB),... {} 
} 

¿Es esa una forma sensata de hacer las cosas? En caso afirmativo, me preguntaba si existía un complemento de terceros o algún atajo práctico para construir automáticamente el texto para el constructor (por ejemplo, tomar las definiciones de miembros resaltados o existentes, reemplazar los puntos y comas con comas, mover todo en la misma línea, ...)? Gracias

+2

Al igual que una nota de estilo, no recomiendo ponerlo todo en una línea. Una vez que supere los 2 o 3 atributos, se volverá difícil de manejar. En su lugar, coloque cada inicializador y, probablemente, cada parámetro en su propia línea. Esto hace que sea más fácil agregar nuevos elementos, se muestran claramente en cualquier control de fuente diff, y probablemente hace que el código sea más fácil de leer (recuerde que el código es generalmente de escritura única, lectura de muchos). –

+0

Nota: Técnicamente, la única diferencia entre una 'struct' y una' clase' en C++ es el especificador de acceso predeterminado. Si todo va a ser público, simplemente conviértalo en una 'struct' (es decir, reemplace' class' con 'struct' en el código anterior y elimine el especificador de acceso' public :: ') –

Respuesta

11

Sí, sólo tiene que utilizar agregados de civil:

struct A 
{ 
    type mA; 
    type mB; 
    ... 
}; 

Uso:

A x = { mA, mB, ... }; 

Un agregado tiene constructores personalizados, destructor y asignación del operador, y permite para muchas optimizaciones. La inicialización agregada con la sintaxis del paréntesis, por ejemplo, generalmente construye los miembros en su lugar sin siquiera una copia. También obtendrá la mejor copia posible y moverá los constructores y operadores de asignación definidos por el compilador.

+0

Esto solo funciona si no necesita un destructor –

+0

El OP dice "clases muy simples". ¡La necesidad de un destructor sería el sello distintivo de una clase decididamente no simple! :-) –

+0

@Jeff: El OP menciona que está haciendo esto para las estructuras de estilo C. Entonces puedes prosumir esto. –

1

EDIT: la versión anterior era c99, not C++. ahora es C++

creo que puedes usar {} inicialización en lugar de escribir constructor. o está en C++ 0x? c99? no estoy seguro. pero parece que:

struct A myA = { 3, 5}; 
+1

@Ali: eh, podría simplemente eliminarlo ¿entonces? ¿O mejorarlo? –

+0

no pienses; en realidad lo prueba. PD no compila como C++ –

0

Diría que es una forma sensata de hacerlo, aunque los fanáticos de OO podrían comentar sobre la falta de encapsulamiento que tiene. Sé que Visual Studio tiene fragmentos de código integrados que hacen la mitad del trabajo que está buscando pero depende de su IDE

Cuestiones relacionadas