c – 如何调用std :: vector中包含的对象的构造函数?
当我创建一个对象的std ::向量时,这些对象的构造函数并不总是被调用.
#include <iostream> #include <vector> using namespace std; struct C { int id; static int n; C() { id = n++; } // not called // C() { id = 3; } // ok,called }; int C::n = 0; int main() { vector<C> vc; vc.resize(10); cout << "C::n = " << C::n << endl; for(int i = 0; i < vc.size(); ++i) cout << i << ": " << vc[i].id << endl; } 这是我得到的输出: C::n = 1 0: 0 1: 0 2: 0 ... 这就是我想要的: C::n = 10 0: 0 1: 1 2: 2 ... 在这个例子中,我被迫调整矢量大小,然后手动初始化它的元素? 我想做的是容易地计算在程序中,在不同容器中,在代码的不同点创建的对象的数量,并给每个对象的单个ID. 谢谢! 解决方法
原因是
vector::resize通过调用自动提供的复制构造函数而不是您在示例中定义的构造函数来插入副本.
为了获得所需的输出,您可以明确定义复制构造函数: struct C { //.... C(const C& other) { id = n++; // copy other data members } //.... }; 因为vector :: resize的作用方式(它有一个第二个可选参数,用作其创建的副本的“原型”,在C()的情况下使用默认值),这将在您的示例中创建11个对象“原型”和10个副本). 编辑(包括许多意见中的一些好建议): 这个解决方案有几个缺点值得注意,以及一些可能产生更可维护和明智的代码的选项和变体. >这种方法会增加维护成本和风险.每当您添加或删除类的成员变量时,都必须记住修改您的副本构造函数.如果您依赖于默认的复制构造函数,则不必执行此操作.打击这个问题的一个办法就是将柜台封装在另一个类(like this)中,这也可以说是更好的OO设计,但是当然你还必须牢记the many issues that can crop up with multiple inheritance. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |