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:
- asignar valores iniciales ("constructor")
- hacer una copia de una estructura ("constructor de copias")
- asignar valores a una estructura existente ("operador de asignación de sobrecarga")
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:
namespace Customers
{
struct CustomerStruct
{
char[255] FirstName;
char[255] LastName;
int Age;
bool IsAlive;
bool IsMarried;
}; // struct
CustomerStruct* CreateCustomer
(
char* NewFirstName;
char* NewLastName;
int NewAge;
bool NewIsAlive;
bool NewIsMarried;
)
{
CustomerStruct* NewCustomer = new CustomerStruct();
NewCustomer->FirstName = NewFirstName;
NewCustomer->LastName = NewLastName;
NewCustomer->Age = NewAge;
NewCustomer->IsAlive = NewIsAlive;
NewCustomer->IsMarried = NewIsMarried;
return NewCustomer;
} // CustomerStruct* CreateCustomer (...)
} // namespace
El código que aplica la solución podría ser algo como esto:
#include <Customers>
using Customers;
int main (...)
{
int ErrorCode = 0;
CustomerClass* ThisCustomer =
Customers::CreateCustomer
("John", "Doe", 23, true, true);
// do something with "ThisCustomer"
delete ThisCustomer;
return ErrorCode;
} // int main(...)
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:
// "Plain Old Data" Structure
// No Methods, No "Functors", allowed
strict struct CustomerStruct
{
char[255] FirstName;
char[255] LastName;
int Age;
bool IsAlive;
bool IsMarried;
}; // strict struct
// Object Oriented "Plain Old Data" Structure
// Yes, Methods and "Functors" allowed
relaxed struct CustomerStruct
{
char[255] FirstName;
char[255] LastName;
int Age;
bool IsAlive;
bool IsMarried;
public void Foo();
public void Bar();
public (void*) (SomeFunctor) ();
}; // relaxed struct
// Class and Object Oriented
class CustomerClass
{
public char[255] FirstName;
public char[255] LastName;
public int Age;
public bool IsAlive;
public bool IsMarried;
public void Foo();
public void Bar();
}; // class
Salud.
struct
yclass
es que uno predeterminado es privado y el otro público.