2011-11-20 78 views
0

我有一個方法名稱open_file聲明如下。如何分配ifstream和從方法返回變量?

ifstream& open_file(ifstream &in, const string &filename) 
{ 
    in.close(); 
    in.clear(); 

    in.open(filename.c_str()); 

    return in; 
} 

欲其返回值分配給變量在main()方法:

int main() 
{ 
    ifstream val1; 
    ifstream val2 = open_file(val1, "test.cpp"); 

    return 0; 
} 

我不能編譯代碼。我的問題是:

  1. 我可以將open_file方法的返回值分配給main()中的變量,如果有,該怎麼做?
  2. 如果我不能將返回值從open_file方法賦值給變量,如果將其返回類型更改爲void,有什麼區別?
+0

實際上你想要做什麼?我看到,你通過引用傳遞'val1',他們返回並嘗試將其分配給'val2' ..?另外,什麼是錯誤描述? –

+0

反正參考參數爲什麼返回參考呢?如果這是一個可以輕鬆鏈接的運營商,我可以看到它。否則,函數內的in參數的任何突變都可以在外面觀察到。 –

+0

我嘗試通過引用將val1返回到val2。我來自C#背景,需要了解C++複製如何工作。 – Anonymous

回答

3
ifstream val2 = open_file(val1, "test.cpp"); 

這不會編譯,因爲它試圖使流對象,其由具有由拷貝構造private(見this)禁用的副本。

這樣做:

ifstream & val2 = open_file(val1, "test.cpp"); 
//val1 and val2 is same here, as val2 is just a reference to val1 

但後來,你爲什麼會連做呢?你可以簡單的寫:

open_file(val1, "test.cpp"); 
//use val1 here - no need to define val2 

由於返回值將被忽略,這是更好,如果你做的返回類型void。這不太令人困惑。

+0

這是工作。謝謝納瓦茲。 :) – Anonymous

+0

如果我改變方法返回類型爲void,它有區別嗎?比如它的狀態可能不正確。 – Anonymous

+0

@匿名:不。事實上,我只是編輯了我的答案,暗示了同樣的事情。 – Nawaz