Ce que vous avez est bon. Cependant, je veux juste vous avertir de faire attention ne pas faire cette: (GMan fait allusion à cela, je voulais juste qu'il 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 fait 2 changements à votre code. Premièrement, 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'un de ces changements serait bien, mais ensemble, ils 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 la classe. Et l'ordre que vous les mettez dans votre liste d'initialisation est sans importance.
Gee. Je dois être une porte "pas". :) – nakiya
C'est encore plus vrai, puisqu'il appelle 'pBuilder-> GetLogger()', pas 'p_Builder-> GetLogger()'. Les deux sont légaux, mais le second est sensible à la variable d'instance réorganisée dans la définition de classe. – Eclipse
@Eclipse: Oh, je n'ai même pas vu ça. @nakiya: Vouliez-vous utiliser le membre ou le paramètre? L'un ou l'autre est sûr, tel quel. – GManNickG