2015-04-28 220 views
7

矢量类比方说,我们有A类:没有默认的构造函数

Class A 
{ 
    public: 
     A() = delete; 
     A(const int & y) 
     : x(y) 
     {} 
    private: 
     int x; 
}; 

如何创建一个A类型的std::vector并给出一个参数A的构造?我如何将3添加到vector

+0

这是否要求过多试图在发布之前实际编译您的代码? 'Class','std :: vector ...'和'std :: vector v(100);'都是无稽之谈。 – Praetorian

回答

17

如何创建一个A类型的std::vector并给出一个参数A的构造?

std::vector<A> v1(10, 42); // 10 elements each with value 42 
std::vector<A> v2{1,2,3,4}; // 4 elements with different values 

我怎么会增加3到矢量?

v.emplace_back(3);   // works with any suitable constructor 
v.push_back(3);    // requires a non-explicit constructor 

缺乏一个默认的构造函数只意味着你不能这样做,需要一个操作,如

vector<A> v(10); 
v.resize(20); 

这两个插入默认构造的元素在载体中。

+0

要添加到此答案中(并且请纠正我,如果我错了):为了第一个构造函数进行编译,必须存在从int的隐式转换'A'和一个赋值操作符。如果其中任何一个都不存在(问题中不是这种情况),它将不起作用。 这让我想到:为什么不存在一个可变构造函数来初始化具有多个参数的对象? JorenHeit

+0

@JorenHeit:差不多。它确实需要一个隐式转换构造函数;没有这些,你不得不说'A(42)'或'{42}',而不只是'42'。它还需要一个复制或移动构造函数(不是赋值运算符),但这是'vector'的一般要求。 –

1

诀窍在于如何将元素添加到向量中以及您使用的向量的成员函数。

std::vector<A> v; 
v.emplace_back(3); 
5

模板没有一次性实例化:它们只是实例化需要的东西。 A满足了以下所有条件(构建空载体)是有效的:

std::vector<A> v; 

然而,由于A没有一个默认的构造函数,下面的(创建一个默认初始化内容载体)会失败:

std::vector<A> v(100); 

这是一件好事。然而,有效的方法将被罚款实例:

v.emplace_back(42); 
+0

谢谢巴里!我永远不会将我的头围绕在这个单词上:p – Quentin

相关问题