Pourquoi devrions-nous rendre le constructeur privé en classe? Comme nous avons toujours besoin que le constructeur soit public.
Réponses
Trop de publicités?Quelques raisons pour lesquelles vous pourriez avoir besoin d'un constructeur privé:
- 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.
- Une classe utilitaire , qui ne contient que des méthodes statiques.
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.
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.
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;
}
};