最も簡単で信頼性の高い方法は、単純に変換コンストラクターを使用することです。
class Rectangle
{
public:
Rectangle(uint8_t l, uint8_t h) : length(l), height(h) {};
// ...
};
何らかの理由でこれが不可能になるまで、これはあなたの頼りになる方法でなければなりません。
これを除けば、次に行うべき最善のことは、単にメンバーごとの初期化を行うことです。
Rectangle rect;
rect.width = 20;
rect.height = 40;
上記を行うことが不可能になり、問題のオブジェクトが標準で「集約」(基本的にはPOD)と呼ばれるものである場合は、次のような初期化子を使用できます。
Recatagle rect = {10,20};
これを行うときは、メンバーがクラスで宣言された順序で初期化されることに注意する必要があります。宣言の順序を変更すると、上記のようにすべての初期化が中断されます。これは非常に壊れやすいです。このため、このような構造の使用は、問題のクラスが高度にローカライズされている場合(単一の翻訳ユニットのヘルパークラスなど)に限定し、宣言の順序をそのまま維持する必要があることを文書化します。
コメントごとに編集:
文字列をクラスにコピーしようとしている場合、または任意の種類のデータへのポインタをコピーしようとしている場合は、ディープコピーを実行する必要があります。
class Gizmo
{
public:
Gizmo(const char* str) : str_(0)
{
str_ = new char[strlen(str)+1];
strcpy(str_,str);
}
};
不器用さと上記のコードがいかに脆弱であるかに注意してください。ここでうまくいかないことがたくさんあります。delete
str_
何よりも、いつ破壊されるかを忘れていることGizmo
、醜いこと、そもそも文字列を作成new
する必要性がないこと、過去1回のエラー...リストは続きます。char
これらの理由から、生のポインターを使用したり、スマートポインター(つまりunique_ptr
、shared_ptr
など)またはコレクションクラスを使用したりすることは絶対に避けてください。この場合、std::string
コレクションクラスと考えることができるを使用します。
class Gizmo
{
public:
Gizmo(const char* str) : str_(str) {};
private:
std::string str_;
};
これを自由に変換して、で使用できるようにしu_char*
、ソースポインタが有効であることを確認することで堅牢性を追加してください。