C++汽车经销商系统:vector重复输出与运算符重载问题排查
问题描述
我给汽车和摩托车经销商开发系统,使用vector存储车辆对象时,输出出现大量非预期的重复内容。我创建了vehicleInfo类封装两类车辆的公共属性(后续要给Bike类复用),尝试将所有元素存入vector并重载cout运算符输出全部元素,期望vector能正确管理对象并输出不同内容,但结果只有前两个元素的内容反复输出。
相关代码
主函数代码
#include <iostream> #include <algorithm> #include "Car.h" #include "Bike.h" #include <list> #include <cstdlib> #include <vector> using namespace std; int main() { #ifdef _DEBUG _onexit(_CrtDumpMemoryLeaks); #endif vector<Car> cars ; Car test = Car(2, "2", vehicleInfo("car", "M40 0J2", "lambo", "adventador", 3)); Car test2 = Car(3, "4", vehicleInfo("car", "M40 0J2", "lambo", "adventador", 3)); for (int i = 1; i <= 10; i++) { cars.push_back(test); cars.push_back(test2); } for (Car number : cars) { cout << number << endl; } return 0; }
Car类实现代码
#include "Car.h" #include <iostream> #include <cstdlib> Car::Car(int doors, string seats, const vehicleInfo& carinfo) : number_of_doors(doors), number_of_seats(seats), carInfo(carInfo) { } Car::Car(const Car& src) : number_of_doors(src.number_of_doors), number_of_seats(src.number_of_seats), carInfo(src.carInfo) { } Car::~Car() { } std::ostream& operator<<(ostream& os, Car& rhs) { return os<< rhs.number_of_doors << rhs.number_of_seats << rhs.carInfo; }
Car头文件代码
#include <iostream> using namespace std; class Car { public: Car(const Car& src); Car(int doors, string seats,const vehicleInfo& carinfo); ~Car(); friend ostream& operator<<(ostream& os, Car& rhs); private: int number_of_doors; string number_of_seats; string carInfo; }; ostream& operator<<(ostream& os, Car& rhs);
VehicleInfo头文件代码
#pragma once #include <string> using namespace std; class vehicleInfo { public: vehicleInfo(string type, string reg, string make, string model, int age); ~vehicleInfo(); private: string type; string registration_number; string make; string model; int age; };
输出结果
22 34 22 34 22 34 22 34 22 34 22 34 22 34 22 34 22 34 22 34
问题根源与修复方案
1. 重复输出的直接原因
你在主函数的循环里,每次都把同一个test和test2对象的副本添加到vector中,循环10次自然会得到20个重复交替的元素,输出结果完全符合代码逻辑。如果需要生成不同属性的车辆,应该在循环内部创建新的Car对象,而不是复用外部的两个对象。
2. 代码中的致命错误
(1) Car构造函数初始化错误
Car类的构造函数初始化列表里,carInfo(carInfo)是错误的——你用成员变量自身初始化自己,正确应该用传入的参数carinfo:
// 修复前 Car::Car(int doors, string seats, const vehicleInfo& carinfo) : number_of_doors(doors), number_of_seats(seats), carInfo(carInfo) {} // 修复后 Car::Car(int doors, string seats, const vehicleInfo& carinfo) : number_of_doors(doors), number_of_seats(seats), carInfo(carinfo) {}
(2) Car类成员类型不匹配
Car类的私有成员carInfo被定义为string类型,但你试图用vehicleInfo对象初始化它,类型完全不兼容。需要把成员改成vehicleInfo类型:
// Car.h中修改成员定义 private: int number_of_doors; string number_of_seats; vehicleInfo carInfo; // 替换原来的string carInfo;
(3) 缺少vehicleInfo的ostream重载
要输出Car对象里的carInfo,必须给vehicleInfo类重载<<运算符,否则编译器不知道如何输出这个自定义类:
// 在vehicleInfo.h中添加友元声明 class vehicleInfo { public: vehicleInfo(string type, string reg, string make, string model, int age); ~vehicleInfo(); friend ostream& operator<<(ostream& os, const vehicleInfo& info); // 新增 private: string type; string registration_number; string make; string model; int age; }; // 在vehicleInfo.cpp中实现重载 ostream& operator<<(ostream& os, const vehicleInfo& info) { os << "类型:" << info.type << " 牌照:" << info.registration_number << " 品牌:" << info.make << " 型号:" << info.model << " 使用年限:" << info.age; return os; }
(4) Car的<<运算符参数应设为const引用
为了支持输出const对象和临时对象,Car的<<运算符参数应该是const Car& rhs:
// Car.h中修改声明 friend ostream& operator<<(ostream& os, const Car& rhs); // Car.cpp中修改实现 std::ostream& operator<<(ostream& os, const Car& rhs) { return os << rhs.number_of_doors << "门 " << rhs.number_of_seats << "座 " << rhs.carInfo; }
3. 生成不同车辆对象的示例
如果要在vector中存储不同属性的车辆,修改主函数的循环逻辑,比如随机生成参数:
#include <random> // 需包含随机头文件 int main() { #ifdef _DEBUG _onexit(_CrtDumpMemoryLeaks); #endif vector<Car> cars ; default_random_engine rng(random_device{}()); uniform_int_distribution<int> door_dist(2,4); // 随机生成2-4门 uniform_int_distribution<int> age_dist(1,10); // 随机生成1-10年使用年限 for (int i = 1; i <= 10; i++) { // 每次循环创建新的vehicleInfo和Car对象 vehicleInfo info("car", "M40 " + to_string(i), "lambo", "adventador", age_dist(rng)); Car new_car(door_dist(rng), to_string(door_dist(rng)+2), info); // 座位数=门数+2 cars.push_back(new_car); } for (const auto& car : cars) // 用const引用避免不必要的拷贝 { cout << car << endl; } return 0; }
内容的提问来源于stack exchange,提问作者James Pham
相关产品推荐
相关产品推荐

