2017-10-10 116 views
0

在一类的载体中添加新元素时,我有对象的矢量从一个不同的类,例如:使用非默认构造函数在<class>对象

class Foo { 
private: 
    std::vector<Bar> barObject; 
... 
}; 

把类BAR定义了一个缺省构造(所有专用变量初始化到零),并且其中值可以在进料,如在非默认构造函数:

Bar newBar(var1, var2); 

在类Foo中,barObject矢量被声明,无需指定大小。

我猜,如果我想使用默认的构造函数,我可以这样做:

barObject.resize(barObject.size()+1); 

然后改变barObject我的私有变量在向量是这样的:

barObject.at(i).SetVar(value) 

但是,如果我想要使用非默认构造函数并输入私有变量的值,我是否可以执行类似操作:

barObject.insert(i, tempBar); 

tempBar是Bar类的一个对象,它具有我想要在矢量barObject的位置i处使用的私有值?

+0

太少代码伴随散文。请尽可能多地[mcve]。 – Yunnosch

+0

@Yunnosch很多代码!=更好的问题。它并不总是黑色和白色。 – Rakete1111

+2

@ Rakete1111确实如此,但是通过显示代码很好地增加了描述代码(尽管有用)。 – Yunnosch

回答

2

resize具有过载:

void resize (size_type n, const value_type& val);

这使您可以指定新分配的内存值。但是,如果要将矢量分配为构建的一部分,则也可以这样做。矢量有一个构造函数来做到这一点:

vector (size_type n, const value_type& val, 
     const allocator_type& alloc = allocator_type()); 

然后,所有你必须做的是使用统一初始化语法来构建其载体只有一次:

class Foo { 
public: 
    Foo() : barObject(17, Bar(4, 5)) {} // Creates a 17 length array 
}; 

如果你只是想用你的已建成vector并在其末尾添加元素,您可以使用push_backemplace_back

为了使用你将需要做出一个迭代器插入的位置插入:

auto myIt = barObject.begin() + 3; 
myIt = barObject.insert(myIt, 5, Bar(6, 7)); // Inserts 5 objects at offset 3, and increases its size by 5. 
myIt += 6; 
myIt = barObject.insert(myIt, Bar(8, 7)); // Inserts 1 object at offset 9 (not offset 14), and increases its size by 1. 

为了改变矢量内的值,你可以使用该功能at()operator[]功能:

barObject.at(3) = Bar(4, 5); 
barObject[3] = Bar(4, 5); 

这两者之间的区别是.at()确实边界检查。而operator[]没有。

-1

回答你的问题。是的,你可以做这种插入:

barObject.insert(i, tempBar); 

只要确保迭代i是有效的一个:

std::vector<Bar>::iterator i = barObject.begin(); 
barObject.insert(i, tempBar); 
+1

@Mooing Duck vector :: insert使用迭代器 – StahlRat