2017-04-20 5 views
-2

Ich bin erst neu in C++ Und ich bin am Anfang ... Ich will nur etwas Hilfe ... würde es schätzen, wenn jemand erklären kann, wo ich falsch liege :
allererst meine Time.h Code:>> operator overloading ... 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 

Und jetzt 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; 
} 

Und schließlich source.cpp:

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

Aber wenn ich es kompiliere, gibt es mir einen Fehler:
1.Error C3867 'Zeit :: sethour': Nicht-Standard-Syntax; Verwenden Sie '&', um einen Zeiger auf das Element zu erstellen. Project33 D: \ headers \ Time.cpp 2.Error C2679 binary '>>': Kein Operator gefunden, der einen rechten Operanden vom Typ 'overloaded-function' (oder es gibt keine akzeptable Konvertierung) Project33 D: \ headers \ Time.cpp Kann mir jemand helfen ???

+1

Wenn Sie ein Argument von Wert an eine Funktion, was zu diesem Argumente passiert? Was passiert, wenn Sie versuchen, das Argument zu ändern? Wird diese Änderung im Code widergespiegelt, der Ihre Funktion aufruft? –

Antwort

1

sethour ist eine Elementfunktion keine Membervariable. Sie müssen eine Variable verwenden.

können Sie verwenden:

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

jedoch, dass die aufrufende Funktion etwas Gutes nicht tun, weil Sie eine Kopie ändern. Sie müssen m als Referenz übergeben.

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

Achten Sie darauf, die Deklaration entsprechend zu ändern.

Hat die Funktion nicht ein Freund der Klasse gewesen, könnten Sie verwenden:

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

Es hat funktioniert ... Viel zu schätzen, Mann, –

+0

@ shahid-e-gomnam, froh, dass ich helfen würde. –

+0

Es hat funktioniert ... Viel zu schätzen, Mann ... Es sollte einfach nicht eingestellt werden mit sethour & etc ... weil jemand sagt, dass es immer sicherer ist, auf private Mitglieder von öffentlichen Methoden zuzugreifen ... Kannst du das erklären a bisschen für mich? –

1

Sie lesen in Funktionen hier:

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

, dass ein einfacher Tippfehler. Das größere Problem besteht darin, dass Sie den Wert time wertmäßig übernehmen, wodurch verhindert wird, dass sich Änderungen daran ausbreiten; du wolltest wahrscheinlich dort einen Bezug nehmen.