Hızlı cevap:
Neyi başarmak istediğinize bağlıdır.
Uzun, Genişletilmiş, Sıkıcı Cevap:
Çiviye vurdun.
Genellikle "C ++" izin verir "Struct (s)" yöntemleri bildirmek için izin verir. Tercihen, gerekli yöntemler için açık "Class (s)" ve yalnızca alanlar için POD "Struct (s)" kullanıyorum.
Yine de, bazı temel basit işlemlerin, örneğin:
- başlangıç değerlerini ata ("yapıcı")
- bir yapının kopyasını yap ("kopya oluşturucu)
- mevcut bir yapıya değerler atama ("aşırı yük atama operatörü")
Gereklidir ve bu durumlarda yapılar için yöntemler mantıklıdır.
Öneri
Başka bir potansiyel çözüm, POD yapılarını kullanmaktır, ancak yine de kavramsal olarak bunları sınıflar ve nesneler olarak ele alır.
Bu bildirimleri bir ad alanına sarın ve en önemli eylemler için genel işlevler ekleyin.
Kod bildirimi buna benzer olabilir:
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
Çözümü uygulayan kod şöyle olabilir:
#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(...)
Bu alternatif yaklaşım, büyük miktarda bellek tahsisi gerektiğinde veya diğer düşük seviyeli paylaşılan kütüphanelerle etkileşime girdiğinde daha iyidir.
Bu yaklaşım bazı değişikliklerle Oyun Geliştirme'de uygulanmaktadır.
Ekstra
Şahsen, ben "C ++" sözdizimi uzantısı, hatta bu sorunu çözen yeni bir "C ++" tabanlı PL düşünün:
// "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
Şerefe.