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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:45:42