0

私はC ++演算子のオーバーロードに非常に慣れておらず、歯が生える問題を抱えています。

私は定義しました:

void Graph::operator>>(const char* param)

上記の関数は、文字列を入力として受け取り、その文字列に対して特定のアクションを実行する必要がありました。この関数を呼び出すにはどうすればよいですか? どのような使い方ができますか?

4

4 に答える 4

3

できるように演算子を定義したい場合:

cin >> myGraph
cout << myGraph

以下の例のようにする必要があります。

struct Entry
{
    string symbol;
    string original;
    string currency;

    Entry() {}
    ~Entry() {}
    Entry(string& symbol, string& original, string& currency)
        : symbol(symbol), original(original), currency(currency)
    {}
    Entry(const Entry& e)
        : symbol(e.symbol), original(e.original), currency(e.currency)
    {}
};


istream& operator>>(istream& is, Entry& en);
ostream& operator<<(ostream& os, const Entry& en);

次に、演算子を実装します。

istream& operator>>(istream& is, Entry& en)
{
    is >> en.symbol;
    is >> en.original;
    is >> en.currency;
    return is;
}

ostream& operator<<(ostream& os, const Entry& en)
{
    os << en.symbol << " " << en.original << " " << en.currency;
    return os;
}

注: この場合、エントリは構造体であるため、メンバーはパブリックです。それらを公開したくない場合は、オペレーター メソッドをフレンドとして定義して、Entry のプライベート メンバーにアクセスできるようにすることができます。

メンバーが公開されていない場合、エントリは次のようになります。

struct Entry
{
    private:
        string symbol;
        string original;
        string currency;

    public:
        Entry() {}
        ~Entry() {}
        Entry(string& symbol, string& original, string& currency)
            : symbol(symbol), original(original), currency(currency)
        {}
        Entry(const Entry& e)
            : symbol(e.symbol), original(e.original), currency(e.currency)
        {}

        friend istream& operator>>(istream& is, Entry& en);
        friend ostream& operator<<(ostream& os, const Entry& en);
};
于 2009-05-07T06:45:26.903 に答える
2
Graph myGraph;
myGraph >> "bla";

あなたのものは奇妙な使用法であることに注意してくださいoperator>>()。通常は次のように使用します。

NumericObject NumericObject::operator>>(NumericObject const& operand) const;
// bitshifts to the right

std::istream& operator>>(istream& in, StreamableObject& obj);
// parses a string representation of obj
于 2009-05-07T06:33:26.840 に答える
1

あなたが実際にやろうとしていることは、次のようなコードを書くことができると思います:

cin >> myGraph;
cout << myGraph;

グラフ オブジェクトは、実際にはそのメソッドが呼び出されるオブジェクトではないことに注意してください。

この場合、実際にやりたいことは、グローバル operator>> 関数をオーバーロードすることです。

std::istream& operator>> (std::istream&, graph&);
std::ostream& operator<< (std::ostream&, const graph&);
于 2009-05-07T06:39:59.570 に答える
0

これに慣れていない場合は、解決しようとするかなり興味深い (「単純ではない」と読む) 問題を選択したことになります。

演算子のオーバーロードは正確には関数ではありません。これらは、コンパイラが次のようなコードを解決しようとするときに間接的に呼び出されます。

Graph g = new Graph();
g >> "do something";

これを行わないことをお勧めします。演算子のオーバーロードは、副作用のおかげで、トラブルシューティングが非常に困難なバグにつながる可能性があります。また、コードを保守しなければならない人 (なぜこれを行ったかを忘れてしまったあなたかもしれません) にとっても厳しいものです。

演算子のオーバーロードは、その意味と使用法が直感的に理解できる場合にのみ使用してください。

于 2009-05-07T06:35:51.420 に答える