You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将匿名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+]));
  1. 容器类型错误:std::vector<void*>丢失了Level的类型信息,无法安全操作对象,违背C++强类型特性。
  2. 语法错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:05:23