我花了最后 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)
谢谢!