C++和类C++类初始化
我有一个名为“精灵”级,当该被初始化它需要一个布尔变量:
// constructor
Sprite::Sprite(bool type)
{
// set stuff
}
// two Sprites of different types
Sprite Hero(1)
Sprite Enemy(0)
Q.如何初始化的阵列100个类型为0的精灵?
雪碧敌人[100]?
C++和类C++类初始化
我有一个名为“精灵”级,当该被初始化它需要一个布尔变量:
// constructor
Sprite::Sprite(bool type)
{
// set stuff
}
// two Sprites of different types
Sprite Hero(1)
Sprite Enemy(0)
Q.如何初始化的阵列100个类型为0的精灵?
雪碧敌人[100]?
您可以使用默认的构造函数,这将只是默认为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
,然后用constructor取一个值的论点。
像
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);
非常感谢 - 这实际上是一个Arduino项目,不知道如果Arduino有载体 - 我看到somone已经写了自己的:http://forum.arduino.cc/index.php/topic,45626.0.html不是reall我以后通过 –
@JakeFrench如果你正在使用一个符合标准的C++编译器,应该有向量。 –
只使用简单的Arduino草图 –
除非我错了,否则不能直接使用构造函数和对象数组的参数。一种解决方案是使用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));
如果你打算使用C++ 11风格,你也应该使用'std :: vector'构造函数的大括号。 :) –
创建的类的阵列时,它们必须由默认构造函数创建的。
你可以为你的类型参数添加一个默认值“= 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));
使用默认参数:
Sprite::Sprite(bool type=false) : mymember(type)
{}
,然后当你声明:
Sprite Enemies[100];
它会调用所有的100种元素的默认构造函数。
你应该了解成员初始化列表,在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)
{}
非常感谢所有采取一看,看完评论之后,我发现这个工程,超载构造函数:
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
}
Sprite Hero(1);雪碧敌人[100];
这不是如何去做。看我的答案重写您的构造函数。 –
好的,总是乐于学习 –
为了完整起见,有使用展示位置定位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();
为什么downvotes?我觉得这是一个有趣的问题。 – TobiMcNamobi
我同意@TobiMcNamobi !!,让我们把它颠倒过来,给它一些upvotes –
另一方面...这看起来像[C++:使用非默认构造函数动态分配结构的成员数组] (http://stackoverflow.com/questions/6146025/c-dynamically-allocating-a-member-array-of-structs-using-non-default-construc) – TobiMcNamobi