Faire le travail nécessaire avant l’initialisation du membre dans le constructeur

J’ai une question de conception concernant les classes et leurs constructeurs en C ++. Je viens de plusieurs années d’expérience en Java. En Java, je fais des choses comme ceci: j’ai une classe pour gérer une firebase database SQLite en tant que back-end de stockage. Dans le constructeur de cette classe, je donnerais le chemin d’access au répertoire de données des applications en tant que paramètre. Ensuite, je chercherais le fichier de firebase database, établirais une connexion et, par exemple, chargerais l’entrée la plus récente d’une table à des fins de mise en cache.

Mon problème est maintenant de savoir comment faire cela en C ++. Mon principal problème ici est que lorsque l’exécution atteint la première instruction du constructeur, tous les membres de la classe étaient déjà initialisés, de manière implicite ou explicite.

Ma question est la suivante: si j’avais des calculs à faire sur les parameters du constructeur avant de les utiliser pour initialiser les membres de la classe, comment le ferais-je en C ++?

J’ai déjà constaté que je pouvais simplement utiliser l’atsortingbution aux membres dans les constructeurs, mais je vous ai également lu que vous ne devriez pas le faire, car cela voudrait dire que les membres sont d’abord initialisés avec leurs constructeurs par défaut, puis à nouveau.

Quelle est la manière la plus efficace lorsque vous avez des calculs à faire (par exemple, charger et parsingr un fichier de configuration) avant que les membres de la classe puissent être initialisés? Je préférerais simplement donner un chemin au constructeur, puis charger et parsingr une initialisation de membre avec les valeurs chargées à l’intérieur du constructeur.

Mettez la partie calcul dans une fonction séparée:

class C { std::ssortingng x; int y; C(int xarg, int yarg); }; std::ssortingng computeX(int xarg, int yarg) { ... return result; } C::C(int xarg, int yarg) : x(computeX(xarg, yarg)), y(yarg) {} 

En tant que fonction “d’initialisation”, vous pouvez utiliser une fonction globale, une fonction définie localement dans le fichier source (par exemple, dans un espace de noms non nommé), ou même appeler un lambda défini à la place. Vous pouvez également utiliser une fonction membre statique, même si elle est privée, ou une fonction membre de l’un des arguments.