假设我有一个名为Foo的课程。 Foo没有默认构造函数。它有一个构造函数Foo(int x,float y)。
Bar是一个容器类。它包含一个包含Foo实例的向量。
Bar::Bar(int numberOfFoos, int x, float y) {
foovector.resize (numberOfFoos);
for(int i = 0; i < numberOfFoos; i++) {
**read below**
}
此时,我想调用Foo的构造函数并将参数int x和float y传递给它。 Foo的构造函数根据x和y的值做不同的事情。
假设Foo有一个默认构造函数,调整大小矢量函数究竟做了什么?它是否只是在不调用默认构造函数的情况下调整向量的大小?换句话说,是为Foo类型的n个元素保留的空间,但它们没有初始化为任何东西??
如果它没有,如果在这种情况下怎么办?
在for循环中我想以这种方式初始化每个Foo元素:
foovector[i].Foo(int x, float y);
但是我无法以这种方式使用点访问运算符来调用构造函数。我现在甚至不知道构造函数是否已经被resize函数调用过。
问题,我该怎么办?
关于班级向量的另一个相关问题:
在Foo中有一个包含浮点数的向量。 float x参数是它应该保持的浮点数。 Foo的构造函数有一行
arrayofFloats.resize (x);
但这意味着计算机事先并不知道Foo的大小。每个foo可以有不同的大小。它不会导致Foo的矢量问题吗?如果每个Foo可以有不同的大小,如何声明特定大小的向量?
抱歉英语不好,我希望它已经足够清楚了。
谢谢。
答案 0 :(得分:6)
请勿使用resize
来预留空间。相反,请使用reserve
:
foovector.reserve(n); // reserves memory only, no object
// constructions take place
for (std::size_t i = 0; i != n; ++i)
{
foovector.emplace_back(12 * i, i / 3.0); // pushes a new Foo(12*i, i/3.0)
} // at the back of the vector
答案 1 :(得分:1)
如果我理解这一点,你希望Bar构造函数在向量中构造许多Foo实例,每次都有与Foo构造函数相同的参数。 IF Foo构造函数的工作原理是Foo对象在构造之后都是相同的,你可以使用std::vector::assign(size_type n, const value_type& val)
,其中value_type在这种情况下是Foo。如果调用foovector.assign( numberOfFoos, Foo(x, y) )
,向量将构造一个临时Foo对象,并用该对象的numberOfFoos
个副本填充自身。 assign()
还可以处理所有调整大小的需求。
但是如果Foo构造函数涉及随机行为,静态计数器或导致连续调用构造函数导致不同对象的其他东西,则复制不是您想要的。
您的其他问题:
在C ++中,每种类型都有固定的大小。 (这就是多态性仅适用于指针或传递引用语义的原因。)许多类(如std::vector
)管理可根据需要增长或缩小的额外内存。这一切都是在幕后用指针完成的。附加内存(例如向量包含的数据)在某些其他内存位置关闭,不会影响实际内存
对象的大小。 vector
方法size()
,resize()
和reserve()
可以使用该托管内存。因此,无论其向量中有多少项,Foo对象的大小都相同。
答案 2 :(得分:0)
resize
初始化新元素;具体来说,它初始化一个临时对象(使用默认构造函数,如果它是一个类类型),然后使用它复制初始化每个元素。
如果它没有默认构造函数,或者无法进行复制初始化,则无法使用resize
。
但是,您可以使用reserve
来保留内存而不初始化其中的任何对象;然后在该空间中使用push_back
或insert
元素。在C ++ 11中,您还可以使用emplace_back
来避免复制元素:
foovector.reserve (numberOfFoos);
for(int i = 0; i < numberOfFoos; i++) {
foovector.push_back(Foo(42, 1.23)); // C++03, requires copy constructor
foovector.emplace_back(42, 1.23); // C++11, doesn't require copy constructor
}
关于你的额外问题:
但这意味着计算机事先并不知道Foo的大小
是的。向量是一个小对象,包含指向某些动态分配的内存的指针;它的大小是固定的,并不依赖于它分配的内存量。