2015-09-07 19 views
5

Tôi có một lớp sử dụng chức năng bạn bè để quá tải toán tử >>. Phương thức toán tử quá tải kiểm tra tốt việc sử dụng cin chuẩn. Tuy nhiên, khi tôi cố gắng nâng cấp mã để sử dụng các đối tượng ifstream thay vì các đối tượng istream, nguyên mẫu không được nhận dạng như một phương thức hợp lệ. Đó là sự hiểu biết của tôi rằng ifstream được kế thừa từ istream, và như vậy, đa hình nên cho phép các đối tượng ifstream hoạt động với hàm quá tải istream. Điều gì là sai với sự hiểu biết của tôi?Tại sao fstream không sử dụng nguyên mẫu istream của toán tử >>?

Có cần sao chép chức năng cho mọi loại luồng đầu vào không?

Class:

#include <iostream> 
#include <cstdlib> 
#include <fstream> 

using namespace std; 

class Hospital { 
public: 
    Hospital(std::string name); 
    std::string getName(); 
    void write(); 
    friend ostream & operator<<(ostream &os, Hospital &hospital); 
    friend istream & operator>>(istream &is, Hospital &hospital); 
private: 
    void readFromFile(std::string filename); 
    std::string m_name; 
}; 

thực hiện chức năng:

istream &operator>>(istream &is, Hospital &hospital){ 
    getline(is, hospital.m_name); 
    return is; 
} 

Lỗi:

Hospital.cpp: In member function ‘void Hospital::readFromFile(std::string)’: Hospital.cpp:42:24: error: no match for ‘operator>>’ (operand types are ‘std::ifstream {aka std::basic_ifstream}’ and ‘Hospital*’) storedDataFile >> this;

Lỗi này xảy ra trong ngăn xếp sau một cuộc gọi đến readFromFile, mà tôi sao chép ở đây cho đầy đủ :

/** 
* A loader method that checks to see if a file exists for the given file name. 
* If no file exists, it exits without error. If a file exists, it is loaded 
* and fills the object with the contained data. WARNING: This method will overwrite 
* all pre-existing and preset values, so make changes to the class only after 
* invoking this method. Use the write() class method to write the data to a file. 
* @param filename 
*/ 
void Hospital::readFromFile(std::string filename) { 
    ifstream storedDataFile(filename.c_str()); 
    if(storedDataFile){ 
     storedDataFile >> this; 
     storedDataFile.close(); 
    } 
} 

Trong trường hợp này, 'this' là đối tượng Hospital.

Tất cả trợ giúp và ý tưởng đều được đánh giá cao. Tôi đang thuyết phục bản thân mình C++ và tìm kiếm một sự hiểu biết sâu hơn về ngôn ngữ và các quy trình của nó.

+0

'this' là một con trỏ * để * một' đối tượng Hospital'. –

+0

Lấy tên theo tham chiếu const và bạn cũng có thể trả về tên từ 'getName' bằng tham chiếu const nếu nó chỉ là một thành viên của lớp. 'toán tử <<' nên lấy Bệnh viện bằng tham chiếu const. –

Trả lời

8

Bạn sẽ phải sử dụng:

storedDataFile >> *this; 
       // ~~ dereference the `this` pointer (i.e. Hostipal Object) 
       /* Enabling the match for operator>>(istream &is, Hospital &hospital) */ 
+0

Rực rỡ! Tôi hoàn toàn quên rằng các toán tử điều khiển '->' tự động điều này, vì vậy mà không có nó tôi phải dereference bằng tay! Cảm ơn bạn rất nhiều! Tôi có một giới hạn thời gian trước khi tôi có thể chấp nhận câu trả lời của bạn, tôi sẽ trở lại sau khi giới hạn đã được giải thưởng cho bạn. Cám ơn bạn một lần nữa! –

Các vấn đề liên quan