Reputation: 642
I've searched around a lot with this question and found a lot of questions that were similar, but I haven't managed to find a solution. I'm declaring a class:
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 ( );
};
and a corresponding function:
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);
}
}
at compile-time, I get the following errors:
[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
)
I've gathered that ifstream
is rather particular with the assignment and all, but I've no idea how to include it in a class. Thanks in advance for your help!
EDIT: I've tried several permutations of the above class, such as using a normal variable:
std::ifstream flinstream;
As well as using the open()
function suggested:
flinstream.open(cstr);
However, the error remains the same.
Upvotes: 1
Views: 4538
Reputation: 18966
References cannot be left uninitialized. You must initialize all reference members in the initializer list.
flinstream is being initialized in the body of the constructor. By the time the body of the constructor is executing, the value of flinstream must have a legal value. References must always have a legal value.
The initializer list should always be favored over the constructor body.
Upvotes: 0
Reputation: 373452
For starters, unless you really want a reference to an ifstream
, I would just declare the ifstream
in your class as
std::ifstream flinstream;
In C++03 (the previous version of C++), assignment is disabled for stream classes, so the line
flinstream = std::ifstream(cstr);
Will not compile. You can, however, use the std::ifstream::open
method to do this:
flinstream.open(cstr);
/* ... remaining processing ... */
Hope this helps!
Upvotes: 3