web-dev-qa-db-fra.com

Est-il correct d'appeler une fonction dans la liste d'initialisation du constructeur?

Mon instinct est que ce n'est pas le cas. Je suis dans la situation suivante:

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
}

Ou dois-je changer le constructeur et passer un Logger* const à partir de laquelle PluginLoader est construit?

33
nakiya

C'est parfaitement bien et normal. p_Builder a été initialisé avant.

36
GManNickG

Ce que tu as va bien. Cependant, je veux juste vous avertir de faire attention de ne pas le faire: (GMan y a fait allusion, je voulais juste que ce soit parfaitement clair)

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
}

Notez que j'ai apporté 2 modifications à votre code. Tout d'abord, dans la définition de classe, j'ai déclaré p_Logger avant p_Builder. Deuxièmement, j'ai utilisé le membre p_Builder pour initialiser p_Logger, au lieu du paramètre.

L'une ou l'autre de ces modifications conviendrait, mais ensemble, elles introduisent un bogue, car p_Logger est initialisé en premier et vous utilisez le p_Builder non initialisé pour l'initialiser.

Souvenez-vous toujours que les membres sont initialisés dans l'ordre dans lequel ils apparaissent dans la définition de classe. Et l'ordre dans lequel vous les avez mis dans votre liste d'initialisation est sans importance.

23
Benjamin Lindley

Parfaitement une bonne pratique.

Je suggérerais ceci (mais c'est à un niveau purement personnel):

au lieu d'avoir des fonctions appelées dans votre constructeur, pour les regrouper dans une fonction init, uniquement à des fins de flexibilité: si vous devez par la suite créer d'autres constructeurs.

1
Jason Rogers