49 votes

Constructeur privé

Duplicata possible :
Quelle est l'utilité de rendre le constructeur privé dans une classe ?

Où avons-nous besoin d'un constructeur privé ? Comment pouvons-nous instancier une classe ayant un constructeur privé ?

64voto

birryree Points 29165

Un constructeur privé signifie qu'un utilisateur ne peut pas instancier directement une classe. Au lieu de cela, vous pouvez créer des objets en utilisant quelque chose comme la fonction Constructeur nommé Idiom où vous avez static des fonctions de classe qui peuvent créer et renvoyer des instances d'une classe.

L'idiome du constructeur nommé permet une utilisation plus intuitive d'une classe. L'exemple fourni dans la FAQ C++ concerne une classe qui peut être utilisée pour représenter plusieurs systèmes de coordonnées.

Ceci est tiré directement du lien. Il s'agit d'une classe représentant des points dans différents systèmes de coordonnées, mais elle peut être utilisée pour représenter des points en coordonnées rectangulaires et polaires. Afin de rendre le système plus intuitif pour l'utilisateur, différentes fonctions sont utilisées pour représenter le système de coordonnées renvoyé. Point représente.

 #include <cmath>               // To get std::sin() and std::cos()

 class Point {
 public:
   static Point rectangular(float x, float y);      // Rectangular coord's
   static Point polar(float radius, float angle);   // Polar coordinates
   // These static methods are the so-called "named constructors"
   ...
 private:
   Point(float x, float y);     // Rectangular coordinates
   float x_, y_;
 };

 inline Point::Point(float x, float y)
   : x_(x), y_(y) { }

 inline Point Point::rectangular(float x, float y)
 { return Point(x, y); }

 inline Point Point::polar(float radius, float angle)
 { return Point(radius*std::cos(angle), radius*std::sin(angle)); }

Il y a eu beaucoup d'autres réponses qui correspondent également à l'esprit de la raison pour laquelle les constructeurs privés sont toujours utilisés en C++ (notamment le modèle Singleton).

Une autre chose que vous pouvez faire avec elle est de empêcher l'héritage de votre classe car les classes dérivées ne pourront pas accéder au constructeur de votre classe. Bien sûr, dans cette situation, vous avez toujours besoin d'une fonction qui crée des instances de la classe.

29voto

Naveen Points 37095

Une utilisation courante est le modèle singleton, où l'on souhaite qu'une seule instance de la classe existe. Dans ce cas, vous pouvez fournir un static qui effectue l'instanciation de l'objet. De cette façon, le nombre d'objets instanciés d'une classe particulière peut être contrôlé.

6voto

Vardhan Points 2156

Les constructeurs privés sont utiles lorsque vous ne voulez pas que votre classe soit instanciée par l'utilisateur. Pour instancier de telles classes, vous devez déclarer une méthode statique, qui fait le 'new' et retourne le pointeur.

Une classe avec des ctors privés ne peut pas être placée dans les conteneurs STL, car ils nécessitent un ctor de copie.

5voto

Andrey Points 36869

Il est raisonnable de rendre le constructeur privé si d'autres méthodes peuvent produire des instances. Les exemples évidents sont les modèles Singleton (chaque appel renvoie la même instance) et Factory (chaque appel renvoie la même instance). généralement créer une nouvelle instance).

2voto

unwind Points 181987

C'est courant lorsque vous voulez implémenter un singleton. La classe peut avoir une méthode statique "factory" qui vérifie si la classe a déjà été instanciée, et appelle le constructeur si ce n'est pas le cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X