Lo que tienes está bien. Sin embargo, sólo quiero advertirle que tenga cuidado no hacer esto: (GMan aludió a esto, sólo quería dejar 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
}
Nota que hice 2 cambios en el código. Primero, en la definición de clase, declare p_Logger antes de p_Builder. En segundo lugar, utilicé 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 no inicializado para inicializarlo.
Recuerde siempre que los miembros se inicializan en el orden en que aparecen en la definición de la clase. Y el orden en que los pones en tu lista de inicialización es irrelevante.
Gee. Debo ser una puerta 'no'. :) – nakiya
Es aún más así, ya que él está llamando 'pBuilder-> GetLogger()', no 'p_Builder-> GetLogger()'. Ambos son legales, pero el segundo es sensible a la variable de instancia que se reordena en la definición de la clase. – Eclipse
@Eclipse: Oh, ni siquiera vi eso. @nakiya: ¿Quisiste usar el miembro o parámetro? O es seguro, como es. – GManNickG