クラスフィールドがあります
char chars[4]
コンストラクターでこのフィールドを初期化したい。
コンストラクターはパラメーターとして取得する必要がありchar chars[]
、コンストラクター呼び出しでクラス フィールドを初期化したい。
私はそれを行うことができますか、それともコピーを呼び出す必要がありますか?
クラスフィールドがあります
char chars[4]
コンストラクターでこのフィールドを初期化したい。
コンストラクターはパラメーターとして取得する必要がありchar chars[]
、コンストラクター呼び出しでクラス フィールドを初期化したい。
私はそれを行うことができますか、それともコピーを呼び出す必要がありますか?
std::copy
次のように使用します。
class MyClass
{
char m_x[4];
public:
MyClass(const char (&x)[4])
{
std::copy(x, x + 4, m_x);
}
};
ここでは、正確に 4 つの要素を渡すよう強制するために、型を明示的に指定する必要があります。
コピーを呼び出す必要があります。
MyClass::MyClass(const char* param)
{
std::copy(param, param + 4, chars);
}
param にコピーする文字が 4 つあるという保証がないため、これは少し危険なコードです。
vector<char>
別の方法として、イニシャライザ リストで初期化できるa を使用することもできます。
class A
{
public:
A(char* a): a_(a, a + strlen(a)) {}
private:
std::vector<char> a_;
};
http://ideone.com/x9p6Iでデモを参照してください。
これは、さまざまな型をサポートするテンプレートにすることができますが、配列内の要素の数をコンストラクターに提供する必要があります (のstrlen()
配列には適用されないためint
)。例えば:
template <class T>
class A
{
public:
A(const T* a, const size_t count): a_(a, a + count) {}
private:
std::vector<T> a_;
};
http://ideone.com/hhoaCでデモを参照してください。
私が理解したように、作成する必要がありますConversion constructors
。次のようになります。
A::A(const char* string)
{strncpy(chars, string, 4);
}
はい。入力パラメーターから内容をコピーする必要があります。