1

我花了最后 30 分钟试图找出问题所在:

从 .h 文件:

// H/T sent. d-linked list Set

#ifndef SET_H
#define SET_H
#include <iostream>
#include <string>

using namespace std;
typedef string ELEMENT_TYPE;  // a set for string elements

class Set{
private:
    struct Elem {
        ELEMENT_TYPE info;
        Elem *prev, *next;
    };
    Elem *_head, *_tail;
    int _size;

    void copyCode(const Set & v);

    void destructCode();

    ostream& dump(ostream& out, const Set &v);

public:
    Set();

    Set(const Set &rhs);

    ~Set();

    Set& operator=(const Set &rhs);

    bool insert(ELEMENT_TYPE);

    bool erase(ELEMENT_TYPE);

    void clear();

    int size() const { return _size; }

    bool find(ELEMENT_TYPE) const;

    class Iterator{
    private:
    Elem * _cur;

    public:
        Iterator(){}
        explicit Iterator( Elem* );

    Iterator operator++( int );
    Iterator operator++();
        Iterator operator--( int);
    Iterator operator--();

    bool operator==( const Iterator& rhs );
    bool operator!=( const Iterator& rhs );

    ELEMENT_TYPE& operator*();

    ostream& operator<< ( ostream& );

    };

    Iterator begin() const; 
    Iterator end() const; 
    friend ostream& operator<< (ostream&, Set&);
};

bool operator==(const Set&, const Set&);
bool operator!=(const Set&, const Set&);
Set operator&(const Set&, const Set&);
Set operator|(const Set&, const Set&);

#endif

从 .cpp 文件:

string& Set::Iterator::operator*(){

    return _cur -> info;
}


ostream& Set::Iterator::operator<< ( ostream& os ){

    os << _cur -> info << "\n";

    return os;
}

来自 test.cpp:

Set s1;

s1.insert( "1" );
s1.insert( "2" );
s1.insert( "3" );

cout << "Hi\n";

Set::Iterator it = s1.begin();
while( it != s1.end() ){
    cout << *it;
    it++;
}

cout << "Bye\n";

对我来说,这看起来不错,就像我之前所做的每个 operator<< 一样,但是当我运行我的 test.cpp 文件时,我将代码放入其中,我得到:

Hi
321Bye

这显然不是我在 operator<< 定义中提供的信息,而且我还尝试将访问的值替换为“hi\n”之类的虚拟输出;很少成功。这让我相信我定义不正确并且它使用了一些通用的字符串输出运算符。

我确信这是一个非常简单的问题,但我没有梦寐以求的第二双眼睛很容易接近。

编辑:有些人说代码是完美的(脸红)并且问题无法解决,但我不知道我错过了什么,所以我包含了完整的头文件。由于明显的空间原因,我没有包含 .cpp。如果您认为问题可能出在某个领域,我会很乐意发布我的定义。

问题是输出不包含换行符,这表明该运算符根本没有被使用。为什么/没有正确重载的运算符缺少什么(感谢 JBently)

谢谢!

4

1 回答 1

3

您不能将 operator<< 实现为类的方法,它必须是全局函数!

您的运算符<<根本不起作用,因为在方法实现中总是第一个隐式参数是 this所以您的实现类似于具有以下签名的函数:

ostream& operator<< (this, ostream& );

但是要使运算符<<工作-第一个参数应该将ostream& 运算符实现为全局函数,您的问题将得到解决:

ostream& operator<< ( ostream& str, iterator& iter );

在这部分代码中,您只需取消引用迭代器(调用操作员*)

Set::Iterator it = s1.begin();
while( it != s1.end() ){
    cout << *it;
    it++;
}

如果你需要调用 operator<< 重写它:

Set::Iterator it = s1.begin();
while( it != s1.end() ){
    cout << it;
    it++;
}
于 2013-03-19T01:14:43.857 回答