2013-10-01 159 views
1

C++和类C++类初始化

我有一个名为“精灵”级,当该被初始化它需要一个布尔变量:

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

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

Q.如何初始化的阵列100个类型为0的精灵?

雪碧敌人[100]?

+2

为什么downvotes?我觉得这是一个有趣的问题。 – TobiMcNamobi

+1

我同意@TobiMcNamobi !!,让我们把它颠倒过来,给它一些upvotes –

+1

另一方面...这看起来像[C++:使用非默认构造函数动态分配结构的成员数组] (http://stackoverflow.com/questions/6146025/c-dynamically-allocating-a-member-array-of-structs-using-non-default-construc) – TobiMcNamobi

回答

2

您可以使用默认的构造函数,这将只是默认为0值,就像这样:

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

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

现在 雪碧敌人[100] 将工作

或者用少一点的代码使用默认值像这样的构造:

Sprite::Sprite(bool type=false) 
{ 
    //set to type 
{ 
+0

然后你可以使用'std :: fill(敌人,敌人+100,雪碧(1))之类的东西';'如果你需要将它们都设置为true。 – Nossidge

+1

您应该在构造函数体中优先使用初始化列表。 – RedX

6

我的建议是,你使用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); 
+0

非常感谢 - 这实际上是一个Arduino项目,不知道如果Arduino有载体 - 我看到somone已经写了自己的:http://forum.arduino.cc/index.php/topic,45626.0.html不是reall我以后通过 –

+0

@JakeFrench如果你正在使用一个符合标准的C++编译器,应该有向量。 –

+0

只使用简单的Arduino草图 –

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)); 
+0

如果你打算使用C++ 11风格,你也应该使用'std :: vector'构造函数的大括号。 :) –

1

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

你可以为你的类型参数添加一个默认值“= 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)); 
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) 
{} 
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 
} 

Sprite Hero(1);雪碧敌人[100];

+0

这不是如何去做。看我的答案重写您的构造函数。 –

+0

好的,总是乐于学习 –

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();