Requisito previo: Constructores
Un constructor es una función miembro especial de una clase que inicializa objetos de una clase. En C++, el constructor se llama automáticamente cuando se crea el objeto de una clase.
Por defecto, los constructores se definen en la sección pública de la clase. Entonces, la pregunta es ¿se puede definir un constructor en la sección privada de la clase?
Respuesta: Sí, el Constructor se puede definir en la sección privada de la clase.
¿Cómo usar Constructores en la sección privada?
- Uso de Friend Class: si queremos que esa clase no sea instanciada por nadie más, sino solo por una clase amiga.
// CPP program to demonstrate usage of
// private constructor
#include <iostream>
using
namespace
std;
// class A
class
A{
private
:
A(){
cout <<
"constructor of A\n"
;
}
friend
class
B;
};
// class B, friend of class A
class
B{
public
:
B(){
A a1;
cout <<
"constructor of B\n"
;
}
};
// Driver program
int
main(){
B b1;
return
0;
}
Producción:
constructor of A constructor of B
Si comenta la clase de amigo de línea B , encontrará el siguiente error:
test1.cpp: In constructor ‘B::B()’: test1.cpp:9:5: error: ‘A::A()’ is private A(){ ^ test1.cpp:19:11: error: within this context A a1;
- Usando el patrón de diseño Singleton: Cuando queremos diseñar una clase singleton . Esto significa que en lugar de crear varios objetos de clase, el sistema está dirigido por un solo objeto o un número muy limitado de objetos.
- Modismo de constructor con nombre: dado que el constructor tiene el mismo nombre que la clase, los diferentes constructores se diferencian por su lista de parámetros, pero si el número de constructores es mayor, la implementación puede volverse propensa a errores.
Con Named Constructor Idiom, declara todos los constructores de la clase en las secciones privadas o protegidas, y luego, para acceder a los objetos de la clase, crea funciones estáticas públicas.
Por ejemplo, considere a continuación el programa CPP
// CPP program to demonstrate
// ambiguous nature of constructor
// with same no of parameters of same type
#include <iostream>
using
namespace
std;
class
Point
{
public
:
// Rectangular coordinates
Point(
float
x,
float
y);
// Polar coordinates (radius and angle)
Point(
float
r,
float
a);
// error: ‘Point::Point(float, float)’ cannot
// be overloaded
};
int
main()
{
// Ambiguous: Which constructor to be called ?
Point p = Point(5.7, 1.2);
return
0;
}
Este problema se puede resolver con Named Constructor Idiom. El programa CPP anterior se puede mejorar de la siguiente manera:
// CPP program to demonstrate
// named constructor idiom
#include <iostream>
#include <cmath>
using
namespace
std;
class
Point
{
private
:
float
x1, y1;
Point(
float
x,
float
y)
{
x1 = x;
y1 = y;
};
public
:
// polar(radius, angle)
static
Point Polar(
float
,
float
);
// rectangular(x, y)
static
Point Rectangular(
float
,
float
);
void
display();
};
// utility function for displaying of coordinates
void
Point::display()
{
cout <<
"x::"
<<
this
->x1 <<endl;
cout <<
"y::"
<<
this
->y1 <<endl;
}
// return polar coordinates
Point Point::Polar(
float
x,
float
y)
{
return
Point(x*
cos
(y), x*
sin
(y));
}
// return rectangular coordinates
Point Point::Rectangular(
float
x,
float
y)
{
return
Point(x,y);
}
int
main()
{
// Polar coordinates
Point pp = Point::Polar(5.7, 1.2);
cout <<
"polar coordinates \n"
;
pp.display();
// rectangular coordinates
Point pr = Point::Rectangular(5.7,1.2);
cout <<
"rectangular coordinates \n"
;
pr.display();
return
0;
}
Producción :
polar coordinates x::2.06544 y::5.31262 rectangular coordinates x::5.7 y::1.2
Referencias:
1) Modismo de constructor
con nombre 2) ¿Puede un constructor ser privado en cpp?
Este artículo es una contribución de Mandeep Singh . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA