2017-04-20 15 views
-2

私はちょうどC++を初めて使っています。そして私は初めです...ちょっと助けてください...誰かが私がどこでこれについて間違っているのか説明できるなら、 :
すべての私TIME.Hコードの最初の:>>演算子のオーバーロード... C++

#ifndef TIME_H 
#define TIME_H 
#include<iostream> 
using namespace std; 

class time { 
    friend istream &operator>> (istream &, time); 
private: 
    int hour; 
    int minute; 
    int second; 

public: 
    time(int = 0, int = 0, int = 0); 
    void settime(int, int, int); 
    void sethour(int); 
    void setminute(int); 
    void setsecond(int); 
}; 

#endif 

そして今、Time.cpp:

#include<iostream> 
#include"Time.h" 
using namespace std; 
using std::cout; 
using std::cin; 

time::time(int h, int m, int s) 
{ 
    settime(h, m, s); 
} 
void time::settime(int hr, int min, int sec) 
{ 
    sethour(hr); 
    setminute(min); 
    setsecond(sec); 
} 
void time::sethour(int h) 
{ 
    hour = (h >= 0 && h < 24) ? h : 0; 
} 
void time::setminute(int m) 
{ 
    minute = (m >= 0 && m < 60) ? m : 0; 
} 
void time::setsecond(int s) 
{ 
    second = (s >= 0 && s < 60) ? s : 0; 
} 
istream &operator>> (istream &in, time m) 
{ 
    in >> m.sethour >> m.setminute >> m.setsecond; 
} 

そして最後にsource.cpp:

#include<iostream> 
#include"D:\headers\Time.h" 
using namespace std; 
void main() 
{ 
    time t; 
    cin >> t; 
    system("pause"); 
} 

コンパイルするとエラーになります。
1.エラーC3867 'time :: sethour':非標準構文。 '&'を使用して、メンバへのポインタを作成します。Project33 D:\ headers \ Time.cpp
2.Error C2679バイナリ '>>': 'overloaded-function'タイプの右オペランドを取る演算子が見つかりませんでした。許容される変換はありません)Project33 D:\ headers \ Time.cpp 誰かが私を助けることができますか?

+1

、何がその引数になりますか?引数を変更しようとするとどうなりますか?その変更はあなたの関数を呼び出すコードに反映されますか? –

答えて

1

sethourはメンバー変数ではありません。変数を使用する必要があります。

を使用でき

:あなたはコピーを変更しているので、呼び出し元の関数に何か良いを行うことはありませんが

istream &operator>> (istream &in, time m) 
{ 
    return (in >> m.hour >> m.minute >> m.second); 
} 

、。あなたは参考としてmを渡す必要があります。

istream &operator>> (istream &in, time& m) 
{ 
    return (in >> m.hour >> m.minute >> m.second); 
} 

必ず宣言を変更してください。

は、関数は、クラスの友人は、あなたが使用することができなかったら:あなたが関数に値で引数を渡すと

istream &operator>> (istream &in, time& m) 
{ 
    // Read the data. 
    int hour; 
    int minute; 
    int second; 
    in >> m.hour >> m.minute >> m.second; 

    // Set the member values using function calls. 
    m.sethour(hour); 
    m.setminute(minute); 
    m.setsecond(second); 

    return in; 
} 
+1

それは働いた...それは多くの人に感謝、 –

+0

@ shahid-e-gomnam、私は助けてうれしい。 –

+0

それは働いた...それは多くの人に感謝...ちょうどそれは、うそつきなど設定されていない...誰かが公共の方法からプライベートメンバーにアクセスすることはいつもより安全だと言わせる原因で...あなたはこれを説明することができます私のためのビット? –

1

現在地機能に読んでいる:シンプルなタイプミスをだ

in >> m.sethour >> m.setminute >> m.setsecond; 
     ^  ^   ^

を。より大きな問題は、timeを値で取ることで、その変更が伝搬するのを防ぎます。あなたはたぶんそこで参考にしたいと思っていました。

関連する問題