2017-04-20 95 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.Error 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

它的工作......非常感謝它的人...只是不應該設置惠特sethour等...因爲有人說,從公共方法訪問私人成員總是比較安全......你可以解釋這一點對我來說? –

1

你正在閱讀到這裏的功能:

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

這是一個簡單的拼寫錯誤。更大的問題是,您按值取time,這會阻止對其進行任何修改以進行傳播;你可能想在那裏參考一下。