c++ - son - ¿Está bien llamar a una función en la lista de inicializadores de constructores?
que son los constructores en c (3)
Mi intuición es que no lo es. Estoy en la siguiente situación:
class PluginLoader
{
public:
Builder* const p_Builder;
Logger* const p_Logger;
//Others
};
PluginLoader::PluginLoader(Builder* const pBuilder)
:p_Builder(pBuilder), p_Logger(pBuilder->GetLogger())
{
//Stuff
}
¿O debería cambiar el constructor y pasar una Logger* const
desde donde se construye PluginLoader
?
Eso está perfectamente bien y normal. p_Builder
se inicializó antes de él.
Lo que tienes está bien. Sin embargo, solo quiero advertirle que tenga cuidado de no hacer esto : (GMo aludió a esto, solo quería dejarlo perfectamente claro)
class PluginLoader
{
public:
Logger* const p_Logger; // p_Logger is listed first before p_Builder
Builder* const p_Builder;
//Others
};
PluginLoader::PluginLoader(Builder* const pBuilder)
:p_Builder(pBuilder),
p_Logger(p_Builder->GetLogger()) // Though listed 2nd, it is called first.
// This wouldn''t be a problem if pBuilder
// was used instead of p_Builder
{
//Stuff
}
Tenga en cuenta que hice 2 cambios a su código. Primero, en la definición de la clase, declaré p_Logger antes de p_Builder. Segundo, usé el miembro p_Builder para inicializar p_Logger, en lugar del parámetro.
Cualquiera de estos cambios estaría bien, pero juntos introducen un error, porque p_Logger se inicializa primero y se usa el p_Builder sin inicializar para inicializarlo.
Siempre recuerde que los miembros se inicializan en el orden en que aparecen en la definición de clase. Y el orden en que los pones en tu lista de inicialización es irrelevante.
Perfectamente buena práctica.
Sugeriría esto (pero en un nivel puramente personal):
En lugar de tener funciones llamadas en su constructor, agrúpelas en una función init, solo con fines de flexibilidad: si luego tiene que crear otros constructores.