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

C++如何重载+=运算符 修复代码实现订单信息指定格式展示

C++代码问题修正及+=运算符重载实现

原有代码核心错误点

  • 类声明顺序错误:TComanda中使用了Item类型,但Item类定义在TComanda之后,缺少前置声明
  • 大量语法拼写错误:成员函数缺少括号(如getName应写为getName())、拼写错误(TOpeator应为TOperator、objectt应为object、oid应为void等)、返回类型不匹配(getPrice返回int却声明为string)
  • 类成员缺失:TComanda未存储关联的操作员信息、缺少构造函数接收状态和操作员两个参数、动态商品数组未做扩容逻辑
  • 方法缺失:TOperator类未实现displayCommanda方法、各类的默认构造函数未实现
  • 命名空间遗漏:string属于std命名空间,代码中未加前缀也未声明命名空间引用

原有+=运算符重载的错误原因

  • 参数不匹配:实际调用时是给订单添加Item对象,但重载函数参数定义为string和TOperator类型,完全不匹配调用逻辑
  • 返回值不符合规范:C++中重载+=运算符惯例返回当前对象的引用TComanda&,原有代码返回新对象且无return语句
  • 成员访问非法:TComanda类本身没有name成员,TOperator类也没有status成员,两行赋值逻辑完全不成立
  • 功能逻辑错误:+=的作用是给当前订单新增商品,不是拼接名称和状态字段

修正后完整可运行代码

#include <iostream>
#include <string>
#include <cstring>
using namespace std;

class Item {
private:
    string object;
    int price;
public:
    Item() : price(0) {}
    Item(string object, int price) {
        this->object = object;
        this->price = price;
    }
    void setObject(string object) { this->object = object; }
    string getObject() { return object; }
    void setPrice(int price) { this->price = price; }
    int getPrice() { return price; }
};

class TOperator; // 前置声明

class TComanda {
private:
    Item* I = nullptr;
    int count = 0;
    string status;
    TOperator* oper = nullptr; // 存储关联的操作员
public:
    TComanda() = default;
    TComanda(string status, TOperator* op);
    void setStatus(string status) { this->status = status; }
    string getStatus() { return status; }
    TOperator* getOper() { return oper; }
    TComanda& operator+=(const Item& item); // 重载+=运算符
    int getItemCount() { return count; }
    Item* getItems() { return I; }
    ~TComanda() { delete[] I; } // 析构释放动态数组
};

class TOperator {
private:
    string name;
    TComanda* command = nullptr; // 存储关联的订单
public:
    TOperator() = default;
    TOperator(string name) { this->name = name; }
    void setName(string name) { this->name = name; }
    string getName() { return name; }
    void setCommand(TComanda* cmd) { command = cmd; }
    void displayCommanda(); // 实现展示订单方法
};

// 类外实现成员函数
TComanda::TComanda(string status, TOperator* op) {
    this->status = status;
    this->oper = op;
    op->setCommand(this); // 双向绑定操作员和订单
}

TComanda& TComanda::operator+=(const Item& item) {
    // 动态扩容数组
    Item* newItems = new Item[count + 1];
    for (int i = 0; i < count; i++) {
        newItems[i] = I[i];
    }
    newItems[count] = item;
    delete[] I;
    I = newItems;
    count++;
    return *this; // 返回自身引用,符合+=运算符使用习惯
}

void TOperator::displayCommanda() {
    if (!command) return;
    // 输出格式:Alex online, usb stick, 220, keyboard, 175
    cout << name << " " << command->getStatus();
    for (int i = 0; i < command->getItemCount(); i++) {
        cout << ", " << command->getItems()[i].getObject() << ", " << command->getItems()[i].getPrice();
    }
    cout << endl;
}

int main() {
    TOperator oper("Alex");
    TComanda command("online", &oper);
    command += Item("usb stick", 220);
    command += Item("keyboard", 175);
    oper.displayCommanda();
    return 0;
}

运行结果

Alex online, usb stick, 220, keyboard, 175

实现说明

  • +=运算符重载接收一个Item常量引用,每次调用时动态扩容订单的商品数组,将新商品加入后返回当前订单的引用,支持链式调用
  • 操作员和订单做了双向绑定,保证displayCommanda方法可以从操作员实例访问到对应的订单信息,按要求格式输出内容
  • 添加了析构函数释放动态申请的商品数组,避免内存泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:45:00