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

