问题描述
我正在做 Savitch 的 Problem Solving With C++ Global Edition 第 13 章的编程项目 6。我试图重载 <<
运算符来打印列表。它一直工作到我的 walker 指针第二次被分配给 head 指针的值,这使得我无法将该列表用作项目要求的循环链表。我在这里重新创建了崩溃源的最基本形式:
Suitors.h 文件:
#include <iostream>
struct Suitor {
int number;
Suitor *link;
};
class Suitors {
private:
Suitor *head=nullptr;
int size=0;
public:
//Constructors
Suitors(int sizePar);
~Suitors(); //Destructor
//Print list
friend std::ostream& operator<<(std::ostream& outs,const Suitors& list);
};
Suitors.cpp 文件:
#include "Suitors.h"
Suitors::Suitors(int sizePar) {
Suitor *tempPtr = new Suitor;
size = sizePar;
for (int i=0; i<size; i++) {
if (head==nullptr) {
head = tempPtr;
}
tempPtr->number = i+1;
if (i==size-1) {
tempPtr->link = head;
}
else {
tempPtr->link = new Suitor;
}
tempPtr = tempPtr->link;
}
}
Suitors::~Suitors() {
Suitor *walker1 = head,*walker2 = head;
for (int i=0; i<size; i++) {
walker1 = walker1->link;
delete walker2;
walker2 = walker1;
}
head = nullptr;
}
std::ostream& operator<<(std::ostream& outs,const Suitors& list) {
Suitor *walker = list.head;
walker = walker->link;
walker = list.head;
/*
for (int i=0; i<list.size; i++) {
outs << walker->number << " ";
walker = walker->link;
}
*/
}
main.cpp 文件:
#include <iostream>
#include "Suitors.h"
void project6();
int main() {
std::cout << "Hello,World!" << std::endl;
project6();
return 0;
}
void project6() {
Suitors six(6);
std::cout << six << std::endl;
}
我已将
解决方法
当我编译你的代码时,编译器告诉了我两件事。
- 函数
return
中没有std::ostream& operator<<(std::ostream&,const Suitors&)
语句,该语句被声明为返回非void
。 - 该函数的
outs
参数未使用。
尽管编译器缺乏人类智能,但他们确实擅长发现代码中的疏忽。因此,我通过向该函数添加行 return outs;
来解决这些警告。分段错误消失了。