C++ とクラス
「Sprite」というクラスがあります。これが初期化されると、bool 変数を取ります。
// constructor
Sprite::Sprite(bool type)
{
// set stuff
}
// two Sprites of different types
Sprite Hero(1)
Sprite Enemy(0)
Q. タイプ 0 の 100 個のスプライトの配列を初期化するにはどうすればよいですか?
スプライトの敵[100] ?
私の提案は、 a を使用してから、値の引数を取るコンストラクターstd::vector
を使用することです。
お気に入り
std::vector<Sprite> Enemies(100, Sprite(false));
それが機能するには、適切なコピーコンストラクターとコピー代入演算子を定義する必要がある場合がありますSprite
。
ベクトルを持っていない場合 (またはstd::array
、あなたの場合はどちらが良いかもしれません)、配列を通常の配列として宣言し、ループを使用して各エントリを初期化する必要があります。
Sprite Enemies[100];
for (size_t i = 0; i < 100; ++i)
Enemies[i].set(false);
私が間違っていない限り、オブジェクト配列のパラメーターでコンストラクターを直接使用することはできません。1つの解決策は、次を使用することstd::vector
です:
std::vector<Sprite> Ennemies(100, Sprite(false));
std::vector<Sprite> Ennemies(100, {false}); // C++11 style
本当にCスタイルの配列が必要な場合は、例で取得できます:
Sprite* pEnnemies = &Ennemies.front();
std::array
もう 1 つの解決策は、STL 構文の C スタイル配列にすぎない新しい C++11 コンテナーを使用することです。
std::array<Sprite, 100> Ennemies(Sprite(false));
完全を期すために、placement- を使用する最後の方法が 1 つありますnew
。
unsigned char data[sizeof(Sprite) * 100];
Sprite* ptr = reinterpret_cast<Sprite*>(&data[0]);
Sprite* end = ptr + 100;
for (; ptr != end; ++ptr)
new (ptr) Sprite(0);
これは、コピーコンストラクターが内部で使用することに依存しない他の回答のほとんどです。
自明でないデストラクタがある場合は、の存続期間のSprite
終わりに別のループを使用して明示的に呼び出す必要があります。data
Sprite* ptr = reinterpret_cast<Sprite*>(&data[0]);
Sprite* end = ptr + 100;
for (; ptr != end; ++ptr)
ptr->~Sprite();
クラスの配列を作成するときは、デフォルトのコンストラクターで作成する必要があります。
型パラメーターにデフォルト値「= false」を追加すると、コードが機能します。ただし、他のタイプの配列が必要になる場合があるため、あまり柔軟ではありません。
もう 1 つの方法は、スプライトを別のタイプで作成した後にリセットできるようにすることです。空白のスプライトの配列を作成したら、for ループでそれらに対して reset(type) を呼び出します。
要素でデフォルト以外のコンストラクターを本当に使用する必要がある場合は、std::vector を使用してください。それには2つの方法があります。
std::vector<Sprite> Enemies;
Enemies.reserve(100);
for (int i = 0; i < 100; i++)
{
Enemies.push_back(Sprite(0));
}
また
std::vector<Sprite> Enemies(100, Sprite(0));