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

C++中存储多类型成员类对象的动态数组实现问题

问题解决与代码修正

先明确你代码里的核心问题,再结合vector的用法给出完整修正方案:

1. 代码中的语法错误

  • 大小写敏感问题:C++对标识符大小写严格区分,你的addVehicle函数参数写的是std::vector<vehicle>&、局部变量是vehicle v;,但类名是首字母大写的Vehicle,这会直接导致编译错误,必须统一为Vehicle。
  • 头文件缺失:部分编译器需要显式包含<string>头文件才能正常使用std::string,建议补充。

2. 实现"添加任意数量Vehicle"的需求

当前addVehicle仅能添加单辆车,要支持任意数量,可让用户先输入车辆总数,再循环创建并添加对象,或者循环接收输入直到用户主动停止。这里提供第一种方案,更贴合你的初始思路。

3. 关于"不同类型成员变量"的疑虑

你的Vehicle类包含std::string和int类型成员,这完全不影响vector的使用。vector可以存储任何可拷贝、可移动的类型,编译器会为你的类自动生成默认拷贝构造函数,能正确复制std::string和int成员,无需额外处理。

修正后的完整代码

#include <iostream>
#include <vector>
#include <string>

// Silo Storage System
class Silo {
public:
    std::string name;
    int currentVolume;
    int storageVolume;
};

class Vehicle {
public:
    std::string model;
    int capacity;
};

// 支持添加任意数量车辆的函数
void addVehicle(std::vector<Vehicle>& vehicles) {
    int count;
    std::cout << "请输入要添加的车辆数量: " << std::endl;
    std::cin >> count;

    for (int i = 0; i < count; ++i) {
        Vehicle v;
        std::cout << "=== 第" << i+1 << "辆车信息 ===" << std::endl;
        std::cout << "车辆型号: " << std::endl;
        std::cin >> v.model;
        std::cout << "载重容量: " << std::endl;
        std::cin >> v.capacity;

        vehicles.push_back(v);
    }
}

int main() {
    Silo depoSilos[3] = {
        {"Silo 1 - Aggregate", 1400,  40000},
        {"Silo 2 - Aggregate", 2300,  20000},
        {"Silo 3 - Aggregate", 11000,  40000}
    };

    std::cout << "可用料仓数量: " << *(&depoSilos + 1) - depoSilos << std::endl;
    for (int i = 0; i < *(&depoSilos + 1) - depoSilos; i++) {
        double fillRate = static_cast<double>(depoSilos[i].currentVolume) / static_cast<double>(depoSilos[i].storageVolume) * 100;
        std::cout << depoSilos[i].name << " 填充率: " << fillRate 
                  << "%,最大容量: " << depoSilos[i].storageVolume << std::endl;
    }

    std::vector<Vehicle> vehicles;
    addVehicle(vehicles);

    // 验证添加结果:打印所有车辆信息
    std::cout << "\n已添加车辆列表:" << std::endl;
    for (const auto& v : vehicles) {
        std::cout << "型号: " << v.model << ",载重: " << v.capacity << std::endl;
    }

    return 0;
}

额外说明

  • vector::push_back会自动将对象拷贝到内部存储空间,无需手动管理数组扩容;
  • 若想避免对象拷贝,可使用emplace_back直接在vector内部构造对象,这需要给Vehicle类添加对应的构造函数;
  • 访问vector元素时,可通过下标(vehicles[index])或范围for循环(如代码中的验证部分)操作。

内容的提问来源于stack exchange,提问作者RALPH123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:45:15