2012-02-03 2 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 довольно специфичен с назначением и всем, но я не знаю, как включить его в класс. Заранее спасибо за вашу помощь!

EDIT: Я пытался несколько перестановок выше класса, например, с помощью обычной переменной:

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

+0

@ Прекурсор-Ах! Я вижу, что происходит. Поскольку у вас есть 'ifstream' как поле вашего класса, вы не можете копировать или присваивать экземпляры своего класса, потому что нет поддержки копирования для' ifstream'. Вам действительно нужен 'ifstream' как поле? Если да, действительно ли вам нужно копировать свой класс? – templatetypedef

+0

Это очень важно. Можно ли каким-либо образом заставить мой компилятор скопировать его, или я должен сделать дополнительный массив ifstreams для дополнения класса (чтобы они не были в классе, только в массиве равного размера)? – Precursor

0

Литература не может быть оставлена ​​неинициализированной. Вы должны инициализировать все ссылочные элементы в списке инициализаторов.

flinstream инициализируется в теле конструктора. К тому моменту, когда выполняется тело конструктора, значение flinstream должно иметь юридическое значение. Ссылки всегда должны иметь юридическую ценность.

Список инициализаторов всегда должен быть одобрен над корпусом конструктора.

Смежные вопросы