2013-01-16 65 views
3

我想重載我創建的UserLogin類上的輸入運算符。沒有編譯時錯誤引發,但是值也沒有設置。C++輸入運算符重載

,一切都會運行,但UL的內容仍然是: 字符串ID爲突破口 一次登錄是00:00 註銷時間是00:00

切入點

#include <iostream> 
#include "UserLogin.h" 

using namespace std; 

int main() { 
    UserLogin ul; 

    cout << ul << endl; // xxx 00:00 00:00 
    cin >> ul; // sally 23:56 00:02 
    cout << ul << endl; // Should show sally 23:56 00:02 
         // Instead, it shows xxx 00:00 00:00 again 

    cout << endl; 
    system("PAUSE"); 
} 

UserLogin.h

#include <iostream> 
#include <string> 
#include "Time.h" 

using namespace std; 

class UserLogin 
{ 
    // Operator Overloaders 
    friend ostream &operator <<(ostream &output, const UserLogin user); 
    friend istream &operator >>(istream &input, const UserLogin &user); 

    private: 
     // Private Data Members 
     Time login, logout; 
     string id; 

    public: 
     // Public Method Prototypes 
     UserLogin() : id("xxx") {}; 
     UserLogin(string id, Time login, Time logout) : id(id), login(login), logout(logout) {}; 
}; 

UserLogin.cpp

#include "UserLogin.h" 

ostream &operator <<(ostream &output, const UserLogin user) 
{ 
    output << setfill(' '); 
    output << setw(15) << left << user.id << user.login << " " << user.logout; 

    return output; 
} 

istream &operator >>(istream &input, const UserLogin &user) 
{ 
    input >> (string) user.id; 
    input >> (Time) user.login; 
    input >> (Time) user.logout; 

    return input; 
} 
+0

你確定這是代碼? 'friend istream'操作符需要一個const引用,但讀入對象不能是一個const操作。 – juanchopanza

+0

@juanchopanza是的,但在輸入操作符中使用的表達式意味着OP不讀入對象,而是讀入臨時對象(可能在VC上,以便臨時對象可以綁定到內置的非>>非常量引用) 。 – Angew

回答

8

您對operator>>的定義是錯誤的。你需要通過user參數通過非const引用,並擺脫了鑄件:

istream &operator >>(istream &input, UserLogin &user) 
{ 
    input >> user.id; 
    input >> user.login; 
    input >> user.logout; 

    return input; 
} 

的強制類型轉換導致你讀入一個臨時的,然後立即丟棄。

+0

有趣的,因爲我在我的時間類做了同樣的事情,它的工作完美。然而,你提到的變化已經解決了這個問題... – user1960364

+0

@ user1960364接受答案如何呢? (這就是通常的工作原理)。 – Angew

0
input >> (type) var; 

是錯的,不要這樣做。做簡單的

input >> var; 
+0

我添加了模型,因爲它拋出了一個錯誤。演員解決了錯誤,但顯然不是用戶是常量的基本問題。 – user1960364

+0

添加演員陣容是一種打擊你不明白的錯誤的方法,但從長遠來看,切開你的手指更加有效,而且更少痛苦。 **澄清**我不主張採取任何行動。 –

-2
#ifndef STRING_H 
#define STRING_H 

#include <iostream> 
using namespace std; 

class String{ 
    friend ostream &operator<<(ostream&,const String &); 


    friend istream &operator>>(istream&,String &); 

public: 
    String(const char[] = "0"); 
    void set(const char[]); 
    const char * get() const; 
    int length(); 

    /*void bubbleSort(char,int); 
    int binSearch(char,char,int); 

    bool operator==(const String&); 
    const String &operator=(const String &); 
    int &operator+(String);*/ 

private: 
     const char *myPtr; 
    int length1; 

}; 
#endif