C++类已初始化
C++ Class initialized
C++ and class
我有一个名为"Sprite"的类,当初始化时,它需要一个布尔变量:
// constructor
Sprite::Sprite(bool type)
{
// set stuff
}
// two Sprites of different types
Sprite Hero(1)
Sprite Enemy(0)
问。如何初始化 100 个类型 0 的精灵数组?
精灵敌人[100] ?
我的建议是使用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);
您可以使用默认构造函数,该构造函数将仅默认为 0 值,如下所示:
//default constructor
Sprite::Sprite()
{
//set to false
}
Sprite::Sprite(bool type)
{
// set to type
}
现在 精灵敌人[100]将工作
或者使用少一点代码在构造函数中使用默认值,如下所示:
Sprite::Sprite(bool type=false)
{
//set to type
{
除非我错了,否则您不能直接将构造函数与对象数组的参数一起使用。一种解决方案是使用std::vector
:
std::vector<Sprite> Ennemies(100, Sprite(false));
std::vector<Sprite> Ennemies(100, {false}); // C++11 style
如果你真的想要C风格的数组,你可以通过一个例子来得到它:
Sprite* pEnnemies = &Ennemies.front();
另一种解决方案是使用新的 C++11 容器std::array
它只是 STL 语法中的 C 样式数组:
std::array<Sprite, 100> Ennemies(Sprite(false));
创建类数组时,必须由默认构造函数创建它们。
您可以为类型参数添加默认值"= false",然后代码就可以工作了。不过,它不是很灵活,因为您可能需要其他类型的数组。
另一种方法是允许你的精灵在建造后重置为不同类型的角色。创建空白精灵数组后,在 for 循环中对它们调用 reset(type)。
如果确实需要在元素上使用非默认构造函数,请使用 std::vector。有两种方法可以做到这一点。
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));
为了完整起见,还有最后一种方法使用放置- 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();
非常感谢大家的看,在阅读评论后,我发现这有效,重载了构造函数:
class Sprite
{
public:
Sprite();
Sprite(bool type);
void Move();
private:
unsigned int x, y, Ammo;
bool Alive;
bool Type;
};
// constructor
Sprite::Sprite()
{
Alive = true;
Type = 0;
Ammo = 25;
x = random(0, 82);
y = random(0, 20);
}
Sprite::Sprite(bool type)
{
Alive = true;
Type = 1;
Ammo = 25;
x = 20; // get x from btn press
y = 10; // get y from btn press
}
精灵英雄(1);精灵敌人[100];
使用默认参数:
Sprite::Sprite(bool type=false) : mymember(type)
{}
然后当你声明:
Sprite Enemies[100];
它将调用所有 100 个元素的默认 CTOR。
您应该了解成员初始值设定项列表,在 C++ 中编写构造函数的正确方法是:
Sprite(bool type=false); // declaration
...
Sprite::Sprite(bool type) : // definition
x(random(0, 82)),
y(random(0, 20)),
Ammo(25),
Alive(true),
Type(type)
{}
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 在C和C++中初始化结构中的数组
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 在函数内部的声明中初始化数组,并在外部使用它
- 继承:构造函数,初始化C++11中基类的类C数组成员