Форум: Форум C++Разное
Новые темы: 00
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблема с потоками ввода-вывода
 
 автор: silart   (24.09.2007 в 12:42)   письмо автору
 
 

Здравствуйте! Возникла такая проблема. Почему-то при использовании экземпляра класса файлового потока ofstream в качестве свойства своего класса, проект не компелируется.
Пример кода:

#include <Windows.h>
#include <iostream>
#include <fstream>

using namespace std;

class Log
{
private:
ofstream out;
public:

Log(): out("log.txt")
{}

Log operator<<(int m)
{
out << m;
return *this;
}
};

int main()
{
Log l;
return 0;
}

Пользуюсь средой MSVS 2005.
Выдает следующую ошибку:
error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
Почему-то ему не удается обратиться к закрытому свойству _Myfb _Filebuffer класса basic_ostream.

  Ответить  
 
 автор: cheops   (24.09.2007 в 14:14)   письмо автору
 
   для: silart   (24.09.2007 в 12:42)
 

Хм... да фигня какая-то, опять Microsoft своими руками куда не нужно лазит... библиотека-то стандартная... Причём под VS 2003 и Builder 6 ваш код компилируется без ошибок.

  Ответить  
 
 автор: silart   (25.09.2007 в 08:19)   письмо автору
 
   для: cheops   (24.09.2007 в 14:14)
 

Да, и в VS 6.0 тоже компилируется.
А если этот код немного видоизменить, то в VS2005 все начинает работать:
class Log
{
private:
ofstream *pout;
public:

Log(): pout(NULL)
{
pout = new ofstream("log.txt");
}
~Log()
{
delete pout;
}

Log operator<<(int m)
{
*pout << m;
return *this;
}

};

Очень странно. Я уже и MSDN весь перерыл... Может надо какой define объявить?
Не знаю прям че делать... Может еще кто сталкивался с подобной проблемой.

  Ответить  
 
 автор: silart   (25.09.2007 в 09:46)   письмо автору
 
   для: silart   (25.09.2007 в 08:19)
 

УРА, РАЗОБРАЛСЯ!!!!!!!
Оказывается нужно было сделать в своем классе конструктор копий и оператор присваивания закрытыми. Потоковые объекты, оказывается нельзя копировать.
Хотя очень странно, в шестой студии было можно, а щас нельзя! ))))))))))))

  Ответить  
 
 автор: cheops   (25.09.2007 в 10:45)   письмо автору
 
   для: silart   (25.09.2007 в 09:46)
 

Ну, вообще, говоря если возвращаете объект через *this - конструктор копии обязателен - иначе это в конечном итоге приведёт к тому, что вы будете обращаться к разрушенному участку памяти.

  Ответить  
 
 автор: silart   (26.09.2007 в 05:15)   письмо автору
 
   для: cheops   (25.09.2007 в 10:45)
 

Ну операторы пришлось тоже немного видоизменить. Теперь они возвращают не объект, а ссылку на него.
Log& operator<<(const DOUBLE v)
{
fout << v;
return *this;
}

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования