假设我有一个名为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**
}
Run Code Online (Sandbox Code Playgroud)
在这一点上,我想调用Foo的构造函数并将参数int x和float y传递给它.Foo的构造函数根据x和y的值做不同的事情.
假设Foo有一个默认构造函数,调整大小矢量函数究竟做了什么?它是否只是在不调用默认构造函数的情况下调整向量的大小?换句话说,是为Foo类型的n个元素保留的空间,但是它们没有被初始化为任何东西?
如果它没有,如果在这种情况下怎么办?
在for循环中我想以这种方式初始化每个Foo元素:
foovector[i].Foo(int x, float y);
Run Code Online (Sandbox Code Playgroud)
但是我不能以这种方式使用点访问运算符来调用构造函数.我现在甚至都不知道构造函数是否已经被resize函数调用过.
问题是,我该怎么办?
关于类向量的另一个相关问题:
在Foo中有一个包含浮点数的向量.float x参数是它应该保持的浮点数.Foo的构造函数有一条线
arrayofFloats.resize (x);
Run Code Online (Sandbox Code Playgroud)
但这意味着计算机事先并不知道Foo的大小.每个foo可以有不同的大小.它不会导致Foo的矢量问题吗?如果每个Foo可以有不同的大小,如何声明特定大小的向量?
抱歉英语不好,我希望它已经足够清楚了.
谢谢.
不要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
Run Code Online (Sandbox Code Playgroud)
如果我理解正确的话,您希望 Bar 构造函数在向量中构造多个 Foo 实例,每次都使用与 Foo 构造函数相同的参数。如果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、和使用该托管内存。因此,无论 Foo 对象的向量中有多少项,它的大小都是相同的。size()resize()reserve()
| 归档时间: |
|
| 查看次数: |
1488 次 |
| 最近记录: |