2010-03-01 10 views

Respuesta

14

Se llama un "constructor delegar". Todavía no está disponible en el idioma. Pero hay una propuesta formal, la encontrará en el anexo F.3.1 del language specification. Dada la postura de Microsoft hacia C++/CLI, es poco probable que vea la luz pronto.


ACTUALIZACIÓN: delegar constructores tenían una vida más allá de la propuesta en dicho anexo, que se agregaron a la especificación del lenguaje C++ estándar 11. Microsoft ha estado trabajando en la implementación de las adiciones de C++ 11. Delegar constructores finalmente lo hizo para VS2013. Y también funcionan en C++/CLI en esa edición.

1

Puede hacerlo siguiendo

ref class A 
{ 
public: 
    A(int p) : p(p) { this->A::A(); } 
    A() : p(1) {} 

    int p; 
}; 

No es válido el código C++, pero VC compila bien :)

-5

Cuando dijo "Yo sé que no hay manera de hacer esto en C++ puro " usted estaba en error. Es posible hacer eso en C++ nativo. Puede usar el nuevo operador de ubicación para hacerlo.

class A 
{ 

public: 

    A(int p) : p(p) 
    { new(this)A(); } 

    A() : p(1) {}  

    int p; 
}; 
+1

Incorrecto. http://www.parashift.com/c++-faq-lite/init-methods.html – user634175

+0

Esto es tan incorrecto. – Puppy

0

Acabo de tropezar, por la misma pregunta. En mi caso, estoy usando VS2010.

Está claro que VS2010 nunca se actualizará para implementar completamente C++ 11, use VS2015 si necesita un mejor cumplimiento del estándar (lo cual hago cuando puedo). Pero para algunos proyectos (heredados), todavía tengo que usar VS2010.

Un enfoque que funciona en muchos casos (para mí) es el uso de una función privada con todos los códigos de inicialización compartidos en ella. Ejemplo:

class A 
{ 
private: 
    void Inidialise() { /* common initialisation here */ } 

public: 
    A()  { Initialise(); /* specific initialisation for A() here */ } 
    A(bool a) { Initialise(); /* specific initialisation for A(bool) here */ } 
    A(int b) { Initialise(); /* specific initialisation for A(int) here */ } 

    /* etcetera */ 

} 

No resuelve todos los problemas '' y que no previene todos los casos de código duplicado y sale un largo camino.

Cuestiones relacionadas