class A{
A(int a = 5){
DoSomething();
A();
}
A(){...}
}
¿Puede el primer constructor llamar al segundo?¿Puede un constructor llamar a otro constructor en C++?
class A{
A(int a = 5){
DoSomething();
A();
}
A(){...}
}
¿Puede el primer constructor llamar al segundo?¿Puede un constructor llamar a otro constructor en C++?
No before C++11.
En su lugar, extraiga la funcionalidad común en una función separada. Normalmente llamo a esta función constructo().
La segunda llamada llamada "así llamada" se compilaría, pero tiene un significado diferente en C++: construiría un nuevo objeto, un temporal, que luego se eliminará instantáneamente al final de la declaración. Entonces, no.
Sin embargo, un destructor puede invocarse sin problemas.
1 - y 'construct()' es un buen nombre. – peterchen
+1 - y debería agregar que será posible llamar a constructores desde constructores de la misma clase en la próxima versión de C++ (C++ 0x). Ver http://www2.research.att.com/~bs/C++0xFAQ.html#delegating-ctor – Klaim
¿Puedes dar un ejemplo de la función construct()? Sé que es bastante simple, pero creo que la gente lo encontrará útil. – MattClimbs
No antes de C++0x
, no.
PERO, fuera de su interés académico Yo he llegado con una forma realmente horrible * hacerlo utilizando un operador de colocación "nueva" (cuidado de alguien para señalar cómo portátil que es esto?)
#include <new>
#include <iostream>
class A
{
public:
A(int i, int j)
: i_(i), j_(j) { }
A(int i)
{ new (this) A(i, 13); }
int i_,j_;
};
int
main() {
A a1(10,11), a2(10);
std::cout
<< a1.i_ << ", "
<< a1.j_ << std::endl
<< a2.i_ << ", "
<< a2.j_ << std::endl;
return 0;
}
* Demonios no, no escribo esto en el código de producción.
Creo que es bastante portátil; placement-new está en el estándar ISO C++. "Otros usos, sin embargo, incluyen llamar a un constructor directamente, algo que el lenguaje C++ no permite". De wikipedia: http://en.wikipedia.org/wiki/Placement_syntax – haavee
¿Qué sucede si A deriva de una clase B? Se llamará al constructor de B, y luego a A, que luego llamará a A 'nuevo (otro constructor de A) y sobrescribirá todo lo que ya hizo B, y luego llamará a B nuevamente, luego a A'. Conclusión: si B hace algo significativo (es decir, asignando un recurso), esto romperá el código (es decir, provocará una fuga de recursos). – paercebal
@paercebal sí, esto tampoco funcionará si A es una clase abstracta. –
La respuesta es, de hecho, "sí", pero como otros han sugerido, no hace lo que desea. Por supuesto, puede utilizar el constructor de una clase base, ya sea implícita o explícitamente:
struct B {
B() {}
B(int x) {}
};
struct A : public B {
A() {} // calls B() implicitly
A(int a, int b) : B(b) {} // calls B(int) explicitly
};
directamente. Hay algunas formas de evitar esto.
Desde la lista de inicializadores del constructor de su clase, puede llamar a un constructor en cualquier clase base y en todas las variables miembro.
Por lo tanto, normalmente puede refactorizar su clase y dividirla en varias más pequeñas para resolver el problema. El código comúnmente ejecutado se puede colocar en un objeto miembro o quizás una clase base. Entonces cada uno de los constructores de la clase principal solo tiene que decidir qué construcotr usar para inicializar ese miembro.
class B {
B() { }
B(int b) { DoSomething(); }
}
class A{
A(int a = 5) : b(a) { } // call B's constructor which does something
A() : b() {} // call B's constructor which does nothing
B b;
};
Esta es una vieja pregunta; Sin embargo,
class A{
A(int a = 5){
DoSomething();
A();
}
A(){...}
}
podría ser
class A{
A(int a = 5){
*this = A();
DoSomething();
}
A(){...}
}
Creo que la asignación '* this = A();' usaría el constructor de copia predeterminado (si no has definido uno) que puede no ser lo que quieres? – austinmarton
pregunta similar aquí: https: // http: //stackoverflow.com/questions/308276/c-call-constructor-from-constructor –