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
相关产品推荐
相关产品推荐

