A menudo usamos estructuras c ++ para definir la estructura de datos en lugar de la clase, que puede ser un módulo completo con métodos miembros. Ahora en el fondo, sabemos que ambos son iguales (hablando en términos generales).
El hecho de que a menudo usemos / tratemos estructuras como entidades de solo datos crea esta necesidad de no agregar también constructores predeterminados. Pero los constructores siempre son excelentes, simplifican las cosas y ayudan a eliminar errores.
¿Sería mal visto si agrego constructores predeterminados a mis estructuras de datos?
¿La implementación del constructor predeterminado también hace que la estructura no sea POD (tipo de datos antiguo simple) siempre que se cumplan otros criterios?
Para poner las cosas en perspectiva, considere un ejemplo simple, pero en realidad la estructura sería mucho más grande.
struct method
{
char name[32];
float temperature;
int duration;
};
Cada vez que creo un método, tengo que preocuparme (por decir lo menos) si olvidé establecer algún valor. Imagine que me olvido de configurar temperature
y aplicar el método al sistema que ahora es un valor alto aleatorio y causa caos. O me olvidé de configurar duration
y ahora el método se aplica por una alta duración desconocida.
¿Por qué debería asumir la responsabilidad de inicializar el objeto cada vez en lugar de implementar su constructor que lo garantiza?
struct
yclass
es que uno predeterminado es privado y el otro público.Respuestas:
A veces es apropiado agregar un constructor a una estructura y otras no.
Agregar constructor (cualquier constructor) a una estructura evita el uso de inicializador agregado en ella. Entonces, si agrega un constructor predeterminado, también tendrá que definir un constructor no predeterminado inicializando los valores. Pero si desea asegurarse de que siempre inicializa a todos los miembros, es apropiado.
Agregar constructor (cualquier constructor, nuevamente) hace que no sea POD, pero en C ++ 11 la mayoría de las reglas que anteriormente se aplicaban a POD solo se cambiaron para aplicarse a objetos de diseño estándar y agregar constructores no lo rompen. Entonces, el inicializador agregado es básicamente lo único que se pierde. Pero a menudo también es una gran pérdida.
fuente
Con C ++ 11 puedes hacer
Y cada vez que olvida inicializar algo, obtiene la inicialización predeterminada.
fuente
Respuesta rápida:
Depende de lo que quieras lograr.
Respuesta larga, extendida y aburrida:
Golpeaste el clavo.
Por lo general, no me gusta que "C ++" permita que "Estructura (s)" permita declarar métodos. Preferiblemente, utilizo "Clase (s)" explícita para los métodos requeridos y "Estructura (s)" de POD solo para los campos.
Sin embargo, estoy de acuerdo en que algunas operaciones simples básicas, como:
Son necesarios y, en esas circunstancias, los métodos para las estructuras tienen sentido.
Sugerencia
Otra posible solución es usar estructuras POD, pero aún así tratarlas conceptualmente como clases y objetos.
Envuelva esas declaraciones en un espacio de nombres y agregue funciones globales para las acciones más importantes.
La declaración del código podría ser similar a esto:
El código que aplica la solución podría ser algo como esto:
Este enfoque alternativo es mejor cuando se requiere una gran asignación de memoria de datos o al interactuar con otras bibliotecas compartidas de bajo nivel.
Este enfoque, con algunos cambios, se aplica en Game Development.
Extra
Personalmente, considero una extensión de sintaxis para "C ++", o incluso, un nuevo PL basado en "C ++" que resuelve este problema:
Salud.
fuente