Risposta rapida:
Dipende da cosa vuoi raggiungere.
Risposta lunga, estesa, noiosa:
Hai colpito l'unghia.
Di solito non mi piace che "C ++" permetta a "Struct (s)" di dichiarare metodi. Preferibilmente, utilizzo "Classi" esplicite per i metodi richiesti e P.O.D. "Struct (s)" per soli campi.
Tuttavia, sono d'accordo che alcune semplici operazioni di base, come:
- assegna i valori iniziali ("costruttore")
- crea una copia di una struttura ("costruttore di copie)
- assegna valori a una struttura esistente ("overload assign operator")
Sono richiesti e, in quelle circostanze, i metodi per le strutture hanno senso.
Suggerimento
Un'altra possibile soluzione è usare il P.O.D. strutture, ma trattale ancora concettualmente come classi e oggetti.
Avvolgi quelle dichiarazioni in uno spazio dei nomi e, aggiungi funzioni globali, per le azioni più importanti.
La dichiarazione del codice potrebbe essere simile a questa:
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
Il codice che applica la soluzione potrebbe essere qualcosa del tipo:
#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(...)
Questo approccio alternativo è migliore quando è richiesta un'enorme allocazione di memoria di dati o l'interazione con altre librerie condivise di basso livello.
Questo approccio, con alcune modifiche, è applicato in Game Development.
Extra
Personalmente, considero un'estensione di sintassi per "C ++", o anche, una nuova P.L basata su "C ++". questo risolve questo 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
Saluti.