我有一个const向量作为类的成员。我该如何初始化它?
我知道对于常量成员,我们可以初始化它们的唯一方法是通过类的构造函数的列表初始化。但究竟如何用矢量来做,我不知道。
例如,
private async void MainForm_Load(object sender, EventArgs e)
{ //Hide all buttons
button1.Visible = false;
button2.Visible = false;
button3.Visible = false;
await Task.Delay(500);
//show buttons one by one
button1.Visible = true;
await Task.Delay(500);
button2.Visible = true;
await Task.Delay(500);
button3.Visible = true;
}
由于
答案 0 :(得分:8)
您可以在类声明中初始化向量
class ClassA
{
const std::vector<int> m_Vec = {1,2,3};
};
或者在构造函数中使用成员初始化
class ClassA
{
public:
ClassA(std::vector<int> const& vec) : m_Vec(vec) {}
private:
const std::vector<int> m_Vec;
};
答案 1 :(得分:7)
在c ++ 03中,你通过它的构造函数初始化vector,这很尴尬,因为你必须将它复制到其他地方。例如:
static int initializer[] = {1, 2, 3};
ClassA::ClassA() : m_Vec(initializer, initializer + sizeof(initialize) / sizeof(int)) {}
在C ++ 11中,这一切都消失了。在构造函数中:
ClassA::ClassA() : m_Vec{1, 2, 3, 4} {}
在就地:
std::vector<int> m_Vec{1, 2, 3, 4};
答案 2 :(得分:6)
我有一个const向量作为类中的成员。
首先,我通常会说你要避免它以防止以预期方式使用该类(参见下面的示例)。此外,如果数据成员完全封装在类中,则在使用类接口保证以 const方式处理时,没有理由不能将其作为非const数据成员(即,类的实例化无法修改数据成员。)
class ClassA
{
const std::vector<int> m_Vec;
};
int main()
{
ClassA c1;
ClassA c2;
// ...
c1 = c2; // This doesn't compile!
return 0;
}
如何初始化它?
其他答案提供了一些初始化const数据成员的不同方法,但这里是我在其他答案中没有看到的: 使用函数 即可。我认为使用函数的一个优点可能是初始化很复杂并且可能依赖于运行时输入(例如,您可以更新init
函数以采用外部状态来修改std::vector
的初始化方式)
#include <vector>
namespace
{
std::vector<int> init()
{
std::vector<int> result;
// ... do initialization stuff ...
return result;
}
}
class ClassA
{
public:
ClassA() : m_Vec(init()) {}
private:
const std::vector<int> m_Vec;
};
int main()
{
ClassA c1;
return 0;
}
#include <vector>
class ClassA
{
public:
ClassA() : m_Vec(init()) {}
private:
std::vector<int> init()
{
std::vector<int> result;
// ... do initialization stuff ...
return result;
}
const std::vector<int> m_Vec;
};
int main()
{
ClassA c1;
return 0;
}
答案 3 :(得分:3)
像这样:
class ClassA {
const std::vector<int> m_Vec {1,2,3};
};
或者这个:
class ClassA {
ClassA () : m_Vec {1,2,3} {}
const std::vector<int> m_Vec;
};