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」などのダミー出力に置き換えてみました。ほとんど成功しません。これにより、定義が間違っていて、一般的な文字列出力演算子を使用していると思われます。

これは非常に単純な問題だと確信していますが、切望されている2番目の目を簡単にアクセスできません.

編集:コードは完璧であり(赤面)、質問は解決できないと述べている人もいますが、何が欠けているのかわからないので、完全なヘッダーファイルを含めました. 明らかなスペース上の理由から、.cpp は含めませんでした。問題が特定の領域にある可能性があると思われる場合は、喜んで私の定義を投稿します.

問題は、出力に改行が含まれていないことです。これは、演算子がまったく使用されていないことを示唆しています。それはなぜですか / 正しくオーバーロードしていないオペレーターに欠けているもの (JBently に感謝)

ありがとう!

4

1 に答える 1

3

operator<< をクラスのメソッドとして実装することはできません。グローバル関数でなければなりません!

メソッドの実装では常に最初の暗黙の引数が thisであるため、演算子<<はまったく機能しません。したがって、実装は次のシグネチャを持つ関数に類似しています。

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

ただし、演​​算子を機能させるには、<<最初の引数はostream& 演算子をグローバル関数として実装する必要があり、問題は解決されます。

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

コードのこの部分では、イテレータを逆参照するだけです (operator* が呼び出されます)。

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 に答える