如何重载+运算符实现两个自定义队列相加,现有重载写法存在什么问题?
现有代码的核心问题
- 二元运算符重载语法错误:类内定义
operator+作为成员函数时,只能接收1个参数,左操作数默认是当前类实例(this指向的对象),你定义了2个参数不符合语法要求,编译器会直接报错。如果要保留两个参数的写法,需要将该运算符重载声明为类的友元函数,放到类外部定义。 - 逻辑死循环:你写的
operator+内部直接执行q1 + q2,相当于无限递归调用当前的operator+函数,没有任何合并队列的实际逻辑,运行后会直接栈溢出崩溃。 - 补充隐患:当前Queue类没有定义析构函数释放
new申请的动态数组,会产生内存泄漏。
修正后的实现代码
你可以按下面的方式修改运算符重载部分,逻辑是把左队列的所有元素先加入新队列,再把右队列的所有元素追加到新队列末尾,完成两个队列的拼接:
#include <iostream> using namespace std; class Queue { int size; int* queue; public: Queue() { size = 0; queue = new int[100]; } // 补充析构函数避免内存泄漏 ~Queue() { delete[] queue; } void add(int data) { // 简单判断避免数组越界,当前最多支持100个元素 if (size >= 100) { cout << "Queue is full" << endl; return; } queue[size] = data; size++; } void remove() { if (size == 0) { cout << "Queue is empty" << endl; return; } else { for (int i = 0; i < size - 1; i++) { queue[i] = queue[i + 1]; } size--; } } void print() { if (size == 0) { cout << "Queue is empty" << endl; return; } for (int i = 0; i < size; i++) { cout << queue[i] << " <- "; } cout << endl; } // 类内成员函数重载operator+,仅需1个参数,左操作数为当前对象 Queue operator+(const Queue &other) const { Queue res; // 先加入当前队列的所有元素 for (int i = 0; i < size; i++) { res.add(queue[i]); } // 再加入另一个队列的所有元素 for (int i = 0; i < other.size; i++) { res.add(other.queue[i]); } return res; } }; int main() { Queue q1; q1.add(42); q1.add(2); q1.add(8); q1.add(1); Queue q2; q2.add(3); q2.add(66); q2.add(128); q2.add(5); Queue q3 = q1 + q2; q3.print(); return 0; }
运行后输出结果为:42 <- 2 <- 8 <- 1 <- 3 <- 66 <- 128 <- 5 <- ,符合队列相加的预期。
内容的提问来源于stack exchange,提问作者sasanace
相关产品推荐
相关产品推荐

