带指针的重载插入/提取操作符

时间:2017-11-11 23:33:04

标签: c++ pointers operator-overloading

尝试执行简单的任务。打开ifstream,通过重载提取运算符从文本文件中读取。看起来很好,没有执行前错误。相信问题是由于在这里使用指针引起的,但我没有看到问题。最后,我需要创建一个链表并使用重载的插入运算符输出到控制台。

使用Visual Studio。 程序目前因此异常而崩溃:     抛出异常:读取访问冲突。     这是0xCCCCCCD0。

{{1}}

1 个答案:

答案 0 :(得分:0)

实现类的流操作符的正确的方法是通过引用而不是通过指针传递类对象

class Book {
public:
    friend ostream& operator<< (ostream& out, const Book &book) {
        out << book.title_;
        return out;
    }

    friend istream& operator>> (istream& in, Book &book) {
        getline(in, book.title_);
        return in;
    }

    ...
    string getTitle() const { return title_; }
    ... 
};

然后在将Book*指针传递给运算符时取消引用它们:

inputFile >> *head;

inputFile >> *newe;
cout << *newe;

cout << *head << endl;

至于您的崩溃,那是因为当您将newe指针传递给operator>>时,它未被初始化。您需要在每次循环迭代中创建一个新的Book对象:

Book* newe;
for (int i = 0; i < 2; i++) {
    newe = new Book; // <-- add this! 
    inputFile >> *newe;
    ... 
}