素早い回答:
何を達成したいかによります。
長く、長く、退屈な答え:
釘を打ちます。
私は通常、「C ++」で「Struct(s)」でメソッドを宣言できることを嫌います。できれば、必要なメソッドには明示的な「クラス(es)」を使用し、フィールドのみにはPOD「構造(s)」を使用してください。
それでも、次のようないくつかの基本的な簡単な操作に同意します。
- 初期値を割り当てます(「コンストラクター」)
- 構造のコピーを作成します(「コピーコンストラクター」)
- 既存の構造に値を割り当てます(「オーバーロード割り当て演算子」)
必要であり、そのような状況では、構造のための方法は理にかなっています。
提案
別の潜在的な解決策は、POD構造を使用することですが、それでも概念的にそれらをクラスおよびオブジェクトとして扱います。
これらの宣言を名前空間でラップし、最も重要なアクションのためにグローバル関数を追加します。
コード宣言は次のようになります。
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
ソリューションを適用するコードは、次のようなものです。
#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(...)
この代替アプローチは、データの巨大なメモリ割り当てが必要な場合、または他の低レベル共有ライブラリと対話する場合に適しています。
このアプローチは、いくつかの変更を加えて、ゲーム開発に適用されます。
追加
個人的には、「C ++」の構文拡張、またはこの問題を解決する新しい「C ++」ベースのPLを検討しています。
// "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
乾杯。