Resposta rápida:
Depende do que você deseja alcançar.
Resposta longa, prolongada e chata:
Você acertou em cheio.
Normalmente não gosto que "C ++" permita que "Struct (s)" permita declarar métodos. De preferência, eu uso "Class (es)" explícita (s) para os métodos necessários e "Struct (s)" (POD) "apenas para campos.
No entanto, concordo que algumas operações simples básicas, como:
- atribuir valores iniciais ("construtor")
- faça uma cópia de uma estrutura ("construtor de cópias)
- atribuir valores a uma estrutura existente ("operador de atribuição de sobrecarga")
São necessários e, nessas circunstâncias, métodos para estruturas, fazem sentido.
Sugestão
Outra solução potencial é usar estruturas de POD, mas, ainda assim, tratá-las conceitualmente como classes e objetos.
Coloque essas declarações em um espaço para nome e adicione funções globais para as ações mais importantes.
A declaração de código pode ser semelhante a esta:
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
O código que aplica a solução pode ser algo como isto:
#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(...)
Essa abordagem alternativa é melhor quando é necessária uma grande alocação de dados na memória ou na interação com outras bibliotecas compartilhadas de baixo nível.
Essa abordagem, com algumas alterações, é aplicada no desenvolvimento de jogos.
Extra
Pessoalmente, considero uma extensão de sintaxe para "C ++" ou mesmo um novo PL baseado em "C ++" que resolve esse 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
Felicidades.