2012-05-23 16 views
6

Tengamos clase como esta:¿Cómo evitar los constructores de código repetitivo?

struct Base { 
    Base() { ... } 
    Base(int) { ... } 
    Base(int,string) { ... } 
    ... 
}; 

me gustaría heredar muchas clases de Base, así que escribir

struct Son : public Base { 
    Son() : Base() { } 
    Son(int) : Base(int) { } 
    Son(int,string) : Base(int,string) { } 
}; 

struct Daughter : public Base { 
    Daughter() : Base() { } 
    Daughter(int) : Base(int) { } 
    Daughter(int,string) : Base(int,string) { } 
}; 

y yo no es necesario añadir ningún código para los constructores del niño. ¿Es posible heredarlos implícitamente? Para llamarlos de la misma manera que en Base, ¿solo cambia el nombre? El preprocesador se puede abusar aquí, pero ¿hay alguna otra solución?

+1

C++ 11 tiene delegar constructores. – 111111

+0

Sugerencia salvaje: ¿podrías considerar agregar algunos argumentos predeterminados (cuidadosamente seleccionados)? 'Daughter (int i = 0, string s =" Hello "): Base (i, s)' sería un solo constructor. –

+0

@ 111111: ¡Genial! ¿Podría darme un enlace o un ejemplo? –

Respuesta

7

En un compilador compatible con C++ 11 (§12.9 en la norma), en realidad se puede hacer esto con bastante facilidad:

struct Son : public Base { 
    using Base::Base; 
}; 

Este hereda todos los constructores de Base y es Equivalente al código para la clase Son .

Desafortunadamente, parece que los compiladores más populares (como GCC o VC++) aún no son compatibles con esta característica, por lo que no tiene suerte por el momento. Pero pruebe este código en su compilador y vea qué pasa.

+0

¿Existe un compilador que realmente implemente eso? –

+0

Las últimas versiones de, al menos, VStudio y GCC implementan muchas características de C++ 11. Esto parece simple de implementar, así que apostaría que lo hacen, pero realmente no lo sé con certeza. – Gorpik

+0

Parece '(GCC) 4.7.0 20111203 (experimental)' no – Vikas

Cuestiones relacionadas