如何用自定义构造函数创建类对象的std::vector?push_back调用报错求解
解决std::vector存储带自定义构造函数类对象的问题
你的代码存在几个关键问题导致push_back调用失败:
std::vector::push_back()仅接受单个参数(要添加的类对象实例),直接传入构造函数的两个参数不符合语法要求。- 类定义末尾缺少分号,这是C++的强制语法规则。
- 代码中的
"是HTML转义字符,实际编写时需替换为普通双引号"。
下面提供几种可行的解决方式:
方法1:构造临时对象传入push_back
直接在push_back中构造临时的sampleClass对象,将构造参数传递给临时对象:
#include <vector> #include <string> class sampleClass{ private: std::string cID; int cNum; public: sampleClass(std::string inputID, int inputNum){ cID = inputID; cNum = inputNum; } }; // 注意此处的分号 int main(){ std::vector<sampleClass> vSC; vSC.push_back(sampleClass("id1", 1)); vSC.push_back(sampleClass("id2", 2)); }
方法2:使用emplace_back直接在vector内存中构造对象
emplace_back()可以直接将构造参数传递给类的构造函数,在vector的内部内存中直接创建对象,相比临时对象的方式更高效:
#include <vector> #include <string> class sampleClass{ private: std::string cID; int cNum; public: sampleClass(std::string inputID, int inputNum){ cID = inputID; cNum = inputNum; } }; int main(){ std::vector<sampleClass> vSC; vSC.emplace_back("id1", 1); vSC.emplace_back("id2", 2); }
方法3:先创建对象再push_back
如果需要复用对象或更清晰地控制对象创建流程,可以先实例化对象,再将其添加到vector中:
#include <vector> #include <string> class sampleClass{ private: std::string cID; int cNum; public: sampleClass(std::string inputID, int inputNum){ cID = inputID; cNum = inputNum; } }; int main(){ std::vector<sampleClass> vSC; sampleClass obj1("id1", 1); vSC.push_back(obj1); sampleClass obj2("id2", 2); vSC.push_back(obj2); }
额外说明:由于你的类没有定义默认构造函数,vector的resize()等需要自动创建新元素的操作会失效,但push_back和emplace_back不受影响,因为它们是显式触发对象构造的。
内容的提问来源于stack exchange,提问作者nyedoardo
相关产品推荐
相关产品推荐

