C ++ ifstream в классе ошибки - PullRequest
       5

C ++ ifstream в классе ошибки

1 голос
/ 03 февраля 2012

Я много раз искал этот вопрос и нашел много похожих вопросов, но мне не удалось найти решение. Я объявляю класс:

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);

Однако ошибка остается прежней.

Ответы [ 2 ]

3 голосов
/ 03 февраля 2012

Для начала, если вы действительно не хотите ссылку на ifstream, я бы просто объявил ifstream в вашем классе как

std::ifstream flinstream;

В C ++ 03 (предыдущая версия C ++) назначение отключено для потоковых классов, поэтому строка

flinstream =  std::ifstream(cstr);

Не компилируется. Однако вы можете использовать метод std::ifstream::open, чтобы сделать это:

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

Надеюсь, это поможет!

0 голосов
/ 03 февраля 2012

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

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

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

...