1

C++ 和类

我有一个名为“Sprite”的类,当它被初始化时,它需要一个 bool 变量:

// constructor
Sprite::Sprite(bool type)
{ 
   // set stuff
}

// two Sprites of different types
Sprite Hero(1) 
Sprite Enemy(0)

问:如何初始化 100 个类型为 0 的 Sprite 的数组?

精灵敌人[100] ?

4

7 回答 7

6

我的建议是您使用 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);
于 2013-10-01T12:46:06.897 回答
2

除非我错了,否则您不能直接将构造函数与对象数组的参数一起使用。一种解决方案是使用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));
于 2013-10-01T12:47:43.133 回答
2

您可以使用默认构造函数,它将简单地默认为 0 值,如下所示:

//default constructor
Sprite::Sprite()
{ 
  //set to false 
}

Sprite::Sprite(bool type)
{ 
   // set to type
}

现在 Sprite Enemies[100] 将起作用

或者使用更少的代码在构造函数中使用默认值,如下所示:

Sprite::Sprite(bool type=false)
{
     //set to type
{
于 2013-10-01T12:52:30.820 回答
1

为了完整起见,最后一种方法使用placement- 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();
于 2013-10-01T13:28:16.970 回答
1

创建类数组时,它们必须由默认构造函数创建。

您可以为您的类型参数添加一个默认值“= false”,然后代码就可以工作了。但是它不是很灵活,因为您可能需要其他类型的数组。

另一种方法是让您的 sprite 在使用不同类型构建后重置。创建空白精灵数组后,在 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));
于 2013-10-01T12:48:33.883 回答
0

非常感谢大家看一看,在阅读评论后我发现这很有效,重载了构造函数:

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];

于 2013-10-01T12:58:23.070 回答
0

使用默认参数:

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)
{}
于 2013-10-01T12:53:23.687 回答