2017-03-15 87 views
2

我有MyClass.h一類定義如下領域:使用CIN >>和cout <<來填充類C++

#ifndef MyClass_h 
#define MyClass_h 

#include <iostream> 
#include <stdio.h> 
#include <string> 

using namespace std; 

class MyClass { 
public: 
    string input 
    void ReadFrom(istream &is); 
    void WriteTo(ostream &os) const; 
}; 
#endif /* MyClass_h */ 

MyClass.cpp看起來是這樣的:

#include <stdio.h> 
#include <string> 
#include <iostream> 
#include "MyClass.h" 

using namespace std; 

void MyClass::ReadFrom(istream &is) { 
    // put data into member 'input' 
} 

void MyClass::WriteTo(ostream &os) const { 
    // output data in member 'input' 
} 

istream& operator >>(istream &is, MyClass &cls) { 
    cls.ReadFrom(is); 
    return is; 
} 

ostream& operator <<(ostream &os, const MyClass &cls) { 
    cls.WriteTo(os); 
    return os; 
} 

main.cpp樣子這個:

#include <stdio.h> 
#include <string> 
#include <iostream> 
#include "MyClass.h" 

using namespace std; 

int main(int argc, const char * argv[]) { 
    MyClass c; 
    std::cout << "Enter some input" << endl; 
    std::cin >> c; 
    return 0; 
} 

我想完成的是結束騎>><<運營商,以便std::cin可以簡單地讀取數據到班級成員,然後std::cout可以吐出所有這些成員的數據。我不想使用friend函數。

現在,我得到一個錯誤繞std::cin >> c;行說:

無效操作數的二進制表示( 'istream的'(又名 'basic_istream <字符>')和 'MyClass的')

+1

恕我直言,不要試圖過度聰明地過載,這通常是個好主意。也許你真正想要的是一個構造函數,它接受你從用戶那裏讀取的數據,一旦你知道你有需要構造這個對象的數據,就可以顯式地調用這些數據。 –

回答

3

編譯器無法在main.cpp翻譯單元中看到運算符重載,因爲在該文件中找不到重載,也沒有在#include文件中找到重載。你需要在你MyClass.h文件中聲明這兩個重載相反,MyClass聲明之後:

MyClass.h:

#ifndef MyClass_h 
#define MyClass_h 

#include <iostream> 
#include <stdio.h> 
#include <string> 

using namespace std; 

class MyClass { 
public: 
    string input 
    void ReadFrom(istream &is); 
    void WriteTo(ostream &os) const; 
}; 

istream& operator >>(istream &is, MyClass &cls);  
ostream& operator <<(ostream &os, const MyClass &cls); 

#endif /* MyClass_h */ 

可以保留的定義,是在你的MyClass.cpp文件。