如何将匿名C++类实例加入std::vector容器?
JavaScript转C++:std::vector存储Level实例的正确实现
原JavaScript逻辑
你要转写的JS构造函数核心是遍历Counts数组,创建Level实例并推入数组:
constructor(Counts){ this.levels=[]; for(let i=0;i<Counts.length-1;i++){ this.levels.push(new Level( Counts[i],Counts[i+1] )); } }
你的错误C++代码问题
你写的代码存在多处语法和设计问题:
std::vector<void*> levels; levels.push_back(Level l(Counts[i], Counts[i+]));
- 容器类型错误:
std::vector<void*>丢失了Level的类型信息,无法安全操作对象,违背C++强类型特性。 - 语法错误:
push_back参数里不能直接定义变量(Level l(...)),且Counts[i+]是无效写法,应为Counts[i+1]。
正确实现方案
方案1:值语义存储(推荐,非多态场景)
直接用std::vector<Level>存储Level对象,无需指针,C++会自动管理内存,对应JS中对象的存储逻辑:
#include <vector> // 假设Level类定义如下(需确保构造函数可访问) class Level { public: Level(int count1, int count2) : countA(count1), countB(count2) {} private: int countA; int countB; }; // 对应JS构造函数的C++实现 class TargetClass { public: TargetClass(const std::vector<int>& Counts) { // 预分配空间,提升循环效率 levels.reserve(Counts.size() - 1); for (size_t i = 0; i < Counts.size() - 1; ++i) { // emplace_back直接在vector内存中构造Level对象,比push_back更高效 levels.emplace_back(Counts[i], Counts[i+1]); // 也可以用push_back:levels.push_back(Level(Counts[i], Counts[i+1])); } } private: std::vector<Level> levels; };
方案2:智能指针存储(多态场景)
如果Level有子类且需要多态特性,使用std::unique_ptr管理指针,避免手动内存泄漏:
#include <vector> #include <memory> class Level { public: // 多态类必须声明虚析构函数,确保子类对象正确销毁 virtual ~Level() = default; Level(int count1, int count2) : countA(count1), countB(count2) {} private: int countA; int countB; }; class TargetClass { public: TargetClass(const std::vector<int>& Counts) { levels.reserve(Counts.size() - 1); for (size_t i = 0; i < Counts.size() - 1; ++i) { // std::make_unique安全创建智能指针,自动管理内存 levels.push_back(std::make_unique<Level>(Counts[i], Counts[i+1])); } } private: std::vector<std::unique_ptr<Level>> levels; };
关于原生指针的说明
如果一定要用原生指针(不推荐),需确保后续手动释放内存:
std::vector<Level*> levels; // 循环内 levels.push_back(new Level(Counts[i], Counts[i+1])); // 销毁容器时需手动遍历delete for (auto ptr : levels) { delete ptr; } levels.clear();
内容的提问来源于stack exchange,提问作者Keshav.h
相关产品推荐
相关产品推荐

