2014-09-25 28 views
0

我是C++新手,在創建我的程序時使用ifstream時出現問題。如何在用戶定義的類中使用ifstream對象?

void main() { 
string filename; 
ifstream inStream; 
cout << "Enter name of vector/matrix file (test.txt): "; 
cin >> filename; 
inStream.open(filename.c_str()); 
if (!inStream) { 
    cout << "Couldn't open inStream"; 
    exit(1); 
} 

Vector v1(4); 
v1.read(inStream); 
} 

,在這裏我的問題是,我怎麼可以定義爲使用inStream對象Vector類的read()功能:我在main.cpp中如下定義的infstream對象?

class Vector{ 
    private: 
    int length;  
    double * contents; 
    public: 
    void read(ifstream in); 
    } 

我試着將它定義爲 Vector::read(ifstream inStream)但失敗! enter image description here,有誰能給我一個提示嗎?非常感謝!

+1

它是如何失敗?怎麼了 ? – nos 2014-09-25 14:07:12

+0

@nos hi我添加了錯誤 – 2014-09-25 14:13:22

回答

1

我嘗試將其定義爲Vector :: read(ifstream inStream)但失敗,任何人都可以給我一個提示嗎?非常感謝!

在代碼中有幾個問題需要解決。

首先,它不起作用的原因是因爲您按值傳遞對象。代碼應該是:

class Vector{ 
private: 
    int length;  
    double * contents; 
public: 
    void read(ifstream& in); // pass by reference 
} 

其次,這不是一個很好的從流中讀取的接口。考慮這個:

class Vector { 
    int length;  
    double * contents; 
public: 
    friend std::istream& operator<<(std::istream& in, Vector& v); 
}; 

差異:

  • 要實現運營商,而不是載體的操作。這使您可以集成與使用istream的專業化通用代碼無縫閱讀(例如你可以寫:auto v = boost::lexical_cast<Vector>("serialized representation here");

  • 接口而言of std::istreamnot std::ifstream定義。這允許您根據需要使用其他流類型(例如,您可以使用std :: istringstream實例來測試您的代碼)。

如果您仍然需要實現讀取功能,你還是應該離開執行操作,並執行這樣寫的:

void Vector::read(std::istream& in) 
{ 
    in >> *this; 
} 
+0

嗨,非常感謝您的回答!真的很有幫助!!非常感謝! – 2014-09-25 14:23:45

2
void read(ifstream in); 

應該

void read(ifstream& in); 

因爲std::ifstream不可拷貝。你需要通過引用來傳遞它。

+0

的屏幕截圖hi @taocp非常感謝您的回覆!我修改了我的代碼,但仍然暗示該聲明與我之前在h.file中的聲明不兼容...... – 2014-09-25 14:16:44

+0

@ Jessica.Jin更改頭文件中的聲明 – taocp 2014-09-25 14:17:10

相關問題