5

假设我有一个名为 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 有一个默认构造函数,resize 向量函数到底是做什么的?它是否只是在不调用默认构造函数的情况下调整向量的大小?换句话说,是否为 Foo 类型的 n 个元素保留了空间,但它们没有被初始化为任何东西?

如果它没有一个怎么办,就像在这种情况下?

在 for 循环中,我想以这种方式初始化每个 Foo 元素:

foovector[i].Foo(int x, float y);

但我不能以这种方式使用点访问运算符调用构造函数。此时我什至不知道构造函数是否已经被 resize 函数调用。

问题是,我该怎么做?

关于类向量的另一个相关问题:

在 Foo 中有一个包含浮点数的向量。float x 参数是它应该保持的浮点数。Foo 的构造函数有一行

arrayofFloats.resize (x);

但这意味着计算机事先并不知道 Foo 的大小。每个 foo 可以有不同的大小。它不会对 Foo 的向量造成问题吗?如果每个 Foo 可以有不同的大小,如何声明特定大小的向量?

抱歉英语不好,我希望它已经足够清楚了。

谢谢你。

4

3 回答 3

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
于 2013-03-18T17:59:33.497 回答
1

如果我理解这一点,您希望 Bar 构造函数在一个向量中构造多个 Foo 实例,每次都使用与 Foo 构造函数相同的参数。如果Foo 构造函数的工作方式使得 Foo 对象在构造后都相同,则可以使用std::vector::assign(size_type n, const value_type& val),在这种情况下 value_type 是 Foo。如果您调用,向量将构造一个临时 Foo 对象并用该对象的副本foovector.assign( numberOfFoos, Foo(x, y) )填充自己。还可以处理您所有的大小调整需求。numberOfFoosassign()

但是,如果 Foo 构造函数涉及随机行为、静态计数器或其他导致对构造函数的连续调用产生不同对象的东西,则复制不是您想要的。

你的另一个问题:

In C++, every type has a fixed size. (This is why polymorphism only works with pointers or pass-by-reference semantics.) Many classes, such as std::vector, manage additional memory which can grow or shrink as needed. This is all done behind the scenes with pointers. Additional memory, such as the data contained by a vector, is off in some other memory location and does not affect the actual size of the object. The vector methods size(), resize(), and reserve() work with that managed memory. So a Foo object is the same size no matter how many items are in its vector.

于 2013-03-18T18:34:35.717 回答
0

resize 确实初始化了新元素;具体来说,它初始化一个临时对象(使用默认构造函数,如果它是类类型),然后使用它复制初始化每个元素。

如果它没有默认构造函数,或者不能复制初始化,那么你不能使用resize.

但是,您可以使用它reserve来保留内存而不初始化其中的任何对象;然后使用push_backorinsert元素进入该空间。在 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 的大小

是的,它确实。向量是一个小对象,其中包含指向某些动态分配的内存的指针;它的大小是固定的,并不取决于它分配了多少内存。

于 2013-03-18T18:10:26.980 回答