utilizan son qué que programacion para los implementar herencia estructura destructores definicion constructores como c++ constructor variable-initialization

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.