2012-02-03 140 views
1

我搜索了很多这个问题,发现很多类似的问题,但我还没有设法找到解决方案。我声明了一个类:C++ ifstream类错误

class File { 

    public: 
      string fileName; 
      std::ifstream & flinstream; 
      Password pass; 
      //Next block to look at 
      unsigned int nb; 
      unsigned int sectorsLeft; 
File (string name,string passd); 
File (); 
}; 

和相应的功能:

File::File (string name,string passd) { 
     fileName = name; 
     const char* cstr = name.c_str(); 
     pass = Password(passd); 
     flinstream = std::ifstream(cstr); 
     if(!flinstream.good()) { 
      string err = "The file '"; 
      err.append(name); 
      err.append("' could not be opened!"); 
      callError(err,3); 
     } 
    } 

在编译时,我得到以下错误:

[0] => out.cpp: In constructor ‘File::File(std::string, std::string)’: 
    [1] => out.cpp:130:3: error: uninitialized reference member ‘File::flinstream’ 
    [2] => In file included from /usr/include/c++/4.5/ios:39:0, 
    [3] =>     from /usr/include/c++/4.5/ostream:40, 
    [4] =>     from /usr/include/c++/4.5/iostream:40, 
    [5] =>     from out.cpp:1: 
    [6] => /usr/include/c++/4.5/bits/ios_base.h: In member function ‘std::basic_ios<char>& std::basic_ios<char>::operator=(const std::basic_ios<char>&)’: 
    [7] => /usr/include/c++/4.5/bits/ios_base.h:788:5: error: ‘std::ios_base& std::ios_base::operator=(const std::ios_base&)’ is private 
    [8] => /usr/include/c++/4.5/iosfwd:77:11: error: within this context 
    [9] => /usr/include/c++/4.5/iosfwd: In member function ‘std::basic_istream<char>& std::basic_istream<char>::operator=(const std::basic_istream<char>&)’: 
    [10] => /usr/include/c++/4.5/iosfwd:83:11: note: synthesized method ‘std::basic_ios<char>& std::basic_ios<char>::operator=(const std::basic_ios<char>&)’ first required here 
    [11] => /usr/include/c++/4.5/iosfwd: In member function ‘std::basic_ifstream<char>& std::basic_ifstream<char>::operator=(const std::basic_ifstream<char>&)’: 
    [12] => /usr/include/c++/4.5/iosfwd:111:11: note: synthesized method ‘std::basic_istream<char>& std::basic_istream<char>::operator=(const std::basic_istream<char>&)’ first required here 
    [13] => /usr/include/c++/4.5/streambuf: In member function ‘std::basic_filebuf<char>& std::basic_filebuf<char>::operator=(const std::basic_filebuf<char>&)’: 
    [14] => /usr/include/c++/4.5/streambuf:781:7: error: ‘std::basic_streambuf<_CharT, _Traits>::__streambuf_type& std::basic_streambuf<_CharT, _Traits>::operator=(const std::basic_streambuf<_CharT, _Traits>::__streambuf_type&) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_streambuf<_CharT, _Traits>::__streambuf_type = std::basic_streambuf<char>]’ is private 
    [15] => /usr/include/c++/4.5/iosfwd:108:11: error: within this context 
    [16] => /usr/include/c++/4.5/iosfwd: In member function ‘std::basic_ifstream<char>& std::basic_ifstream<char>::operator=(const std::basic_ifstream<char>&)’: 
    [17] => /usr/include/c++/4.5/iosfwd:111:11: note: synthesized method ‘std::basic_filebuf<char>& std::basic_filebuf<char>::operator=(const std::basic_filebuf<char>&)’ first required here 
    [18] => out.cpp: In constructor ‘File::File(std::string, std::string)’: 
    [19] => out.cpp:134:36: note: synthesized method ‘std::basic_ifstream<char>& std::basic_ifstream<char>::operator=(const std::basic_ifstream<char>&)’ first required here 
    [20] => out.cpp: In constructor ‘File::File()’: 
    [21] => out.cpp:142:3: error: uninitialized reference member ‘File::flinstream’ 
    [22] => out.cpp: In member function ‘File& File::operator=(const File&)’: 
    [23] => out.cpp:51:12: error: non-static reference member ‘std::ifstream& File::flinstream’, can't use default assignment operator 
    [24] => out.cpp: In function ‘int main(int, char**)’: 
    [25] => out.cpp:166:57: note: synthesized method ‘File& File::operator=(const File&)’ first required here 
) 

我得知ifstream已经对于作业和所有人来说都是相当特别的,但我不知道如何将它包含在课堂中。在此先感谢您的帮助!

编辑:我已经试过上述类的几个置换,如使用通常的变量:

std::ifstream flinstream; 

除了使用open()功能提示:

flinstream.open(cstr); 

然而,错误仍然相同。

回答

3

对于初学者来说,除非你真的想要一个参考ifstream,我只想宣布ifstream在类如

std::ifstream flinstream; 

在C++ 03(以前版本的C++的),分配对于流类是禁用的,所以行

flinstream = std::ifstream(cstr); 

不会编译。你可以,但是,使用std::ifstream::open方法来做到这一点:

flinstream.open(cstr); 
/* ... remaining processing ... */ 

希望这有助于!

+0

我试过了,以及无效 – Precursor 2012-02-03 03:16:22

+0

@ Precursor-啊!我明白发生了什么事。因为你的'ifstream'是你类的字段,所以你不能复制或分配你的类的实例,因为没有'ifstream'的拷贝支持。你真的需要'ifstream'作为一个领域吗?如果是这样,你真的需要能够复制你的班级吗? – templatetypedef 2012-02-03 03:19:16

+0

这是非常重要的。有什么办法可以让我的编译器勉强地复制它,或者我应该创建一个ifstream的辅助数组来补充类(所以它们不在一个类中,只是以一个相同大小的数组)? – Precursor 2012-02-03 03:21:12

0

引用不能保持未初始化。您必须初始化初始化程序列表中的所有参考成员。

flinstream正在构造函数的主体中初始化。当构造函数的主体执行时,flinstream的值必须具有合法的值。参考文献必须始终具有法律价值。

初始化程序列表应始终比构造函数主体更受青睐。