文字の配列を持つクラスを使用しています。
class board
{
char spot[64];
public:
board();
~board(void);
};
プログラムの開始時に配列内の各値を同じ文字に設定したいのですが、コンストラクターで値を初期化するにはどうすればよいですか? インデックスにアクセスして変更を許可する簡単な方法はありますか?
ありがとうございました、
これは C++03 では実行できません。ただし、C++11 のコンストラクター初期化子リストで配列を初期化することは可能です。
board::board()
: spot { 1, 2, 1, 2, /* ... */ }
{ }
値を入力するか、魔法の variadic テンプレートを考え出して、「N 個の繰り返し値」を提供することができます (型が整数である限り)。また、欠落している要素はゼロで初期化されます (例: char spot[4] { 1, 2 };
)。
アクセスするspot[i]
には、クラス内で使用し、必要に応じて適切なアクセサ関数を記述できます (ただし、クラスがメンバーを単に「転送」するかどうかは常に心配する必要があります。実際には、クラスに高次の機能をカプセル化する必要があります。 )。
「固定値での配列を初期化する」テンプレートコードを見たい場合はN
、おそらくそれを別の質問として投稿する必要があります。
更新: これは、すべての配列要素を value に初期化する単純なテンプレート トリックです2
。
#include <iostream>
#include <utility>
#include <prettyprint.hpp>
class Foo
{
int arr[10];
template <typename T, T> struct Filler { };
template <typename T, bool, unsigned int, T...> struct FillHelper { };
template <typename T, unsigned int I, T V, T ...Vals>
Foo(FillHelper<T, true, I, V, Vals...>)
: arr { V, Vals... } { }
template <typename T, unsigned int I, T V, T ...Vals>
Foo(FillHelper<T, false, I, V, Vals...>)
: Foo(FillHelper<T, I == 1, I - 1, V, V, Vals...>()) { }
template <typename T, unsigned int N, T V>
Foo(Filler<T, V>, T const (&)[N])
: Foo(FillHelper<T, N == 1, N - 1, V>())
{ }
public:
Foo() : Foo(Filler<int, 2>(), arr)
{
std::cout << "Foo: " << arr << "\n";
}
};
int main()
{
Foo x;
}
出力:Foo: [2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
配列内のすべての値をデフォルト値 x に
設定するには、たとえば std::fill_n のようなものを使用して、すべての要素を -1
std::fill_n(array, 100, -1);に設定します。
配列内の各値を同じ文字に設定します
memset を使用しないのはなぜですか? たとえば、各値を 0x01 に初期化します。
board::board()
{
memset(spot, 0x01, sizeof(spot));
}
forループを使用して各要素のみを割り当てることができます。