136 votes

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

Pourquoi devrions-nous rendre le constructeur privé en classe? Comme nous avons toujours besoin que le constructeur soit public.

132voto

nanda Points 12764

Quelques raisons pour lesquelles vous pourriez avoir besoin d'un constructeur privé:

  1. Le constructeur est uniquement accessible à partir de la méthode fabrique statique à l'intérieur de la classe elle-même. Singleton peut également appartenir à cette catégorie.
  2. Une classe utilitaire , qui ne contient que des méthodes statiques.

97voto

Kerido Points 1950

En fournissant un constructeur privé vous prévenir des instances de classe en cours de création, dans tout autre lieu que cette très classe. Il y a plusieurs cas d'utilisation pour la fourniture d'un tel constructeur.

A. Votre classe des instances sont créées en static méthode. L' static méthode est alors déclaré comme public.

class MyClass()
{
private:
  MyClass() { }

public:
  static MyClass * CreateInstance() { return new MyClass(); }
};

B. Votre classe est un singleton. Cela signifie, pas plus d'une instance de votre classe existe dans le programme.

class MyClass()
{
private:
  MyClass() { }

public:
  MyClass & Instance()
  {
    static MyClass * aGlobalInst = new MyClass();
    return *aGlobalInst;
  }
};

C. (s'applique Uniquement à la prochaine C++0x standard), Vous avez plusieurs constructeurs. Certains d'entre eux sont déclarés public, les autres private. Pour réduire la taille du code, les constructeurs publics "appel" les constructeurs privés qui, à son tour faire tout le travail. Votre public constructeurs, il est donc demandé de déléguer constructeurs:

class MyClass
{
public:
  MyClass() : MyClass(2010, 1, 1) { }

private:
  MyClass(int theYear, int theMonth, int theDay) { /* do real work */ }
};

D. Vous souhaitez limiter l'objet de la copie (par exemple, en raison de l'utilisation d'une ressource partagée):

class MyClass
{
  SharedResource * myResource;

private:
  MyClass(const MyClass & theOriginal) { }
};

E. Votre classe est une classe utilitaire. Cela signifie qu'elle ne contient static des membres. Dans ce cas, aucune instance de l'objet doit être créé dans le programme.

12voto

Emile Cormier Points 13654

Laisser une "porte dérobée" qui permet à une autre classe / fonction ami (e) de construire un objet de manière interdite à l'utilisateur. Un exemple qui me vient à l’esprit serait un conteneur construisant un itérateur (C ++):

 Iterator Container::begin() { return Iterator(this->beginPtr_); }
// Iterator(pointer_type p) constructor is private,
//     and Container is a friend of Iterator.
 

10voto

Terry Mahaffey Points 7368

Tout le monde est coincé sur le truc Singleton, wow.

Autres choses:

  • Empêcher les gens de créer votre classe sur la pile; faire des constructeurs privés et seulement des pointeurs de retour via une méthode d'usine.
  • Empêcher la création de copies de la classe (constructeur de copie privée)

8voto

Will Points 30630

Cela peut être très utile pour un constructeur contenant du code commun; Les constructeurs privés peuvent être appelés par d'autres constructeurs, en utilisant le 'this (...);' notation. En rendant le code d'initialisation commun dans un constructeur privé (ou protégé), vous expliquez également explicitement qu'il est appelé uniquement lors de la construction, ce qui n'est pas le cas s'il s'agissait simplement d'une méthode:

 public class Point {
   public Point() {
     this(0,0); // call common constructor
   }
   private Point(int x,int y) {
     m_x = x; m_y = y;
   }
};
 

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