2009-05-07 15 views
0

私はC++演算子のオーバーロードや歯の問題を非常に熟知しています。演算子のオーバーロード>>

私が定義されています

を無効グラフ::演算子>>(のconst char型*ののparam)

は、上記の関数は、入力された文字列を受け入れ、その後に特定のアクションを実行しなければなりませんでした文字列。この関数をどのように呼び出すのですか?どのように使用できますか?

答えて

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 
0

、あなたが解決しようとする(「単純ではない」と読む)ではなく、興味深い問題を選びました。

演算子のオーバーロードは正確には関数ではありません。私はあなたがこれをしないお勧めします

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

:コンパイラは次のようになりますコードを解決しようとするとき、彼らは間接的に呼び出されています。オペレータのオーバーロードは、副作用のおかげでトラブルシューティングに非常に困難なバグにつながる可能性があります。彼らはまたあなたのコードを維持しなければならない人には難しいです(なぜあなたがこれをしたのか忘れてしまったかもしれません)。

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

1

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

cin >> myGraph; 
cout << myGraph; 

注グラフオブジェクトが実際に呼び出さそのメソッドを取得したオブジェクトではないこと。この場合

、あなたが実際にやりたいことはグローバルオペレータ>>機能オーバーロードです:あなたはあなたが行うことができるようにオペレータを定義したい場合は

std::istream& operator>> (std::istream&, graph&); 
std::ostream& operator<< (std::ostream&, const graph&); 
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); 
}; 
+0

おかげで、私は「グローバル」入力された理由は、私はわかりません... – stefanB

+0

>>を正しく使用しましたが、本当はその質問には答えません。 –

関連する問題