|
|
|
| Здравствуйте! Возникла такая проблема. Почему-то при использовании экземпляра класса файлового потока 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. | |
|
|
|
|
|
|
|
для: silart
(24.09.2007 в 12:42)
| | Хм... да фигня какая-то, опять Microsoft своими руками куда не нужно лазит... библиотека-то стандартная... Причём под VS 2003 и Builder 6 ваш код компилируется без ошибок. | |
|
|
|
|
|
|
|
для: 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 в 08:19)
| | УРА, РАЗОБРАЛСЯ!!!!!!!
Оказывается нужно было сделать в своем классе конструктор копий и оператор присваивания закрытыми. Потоковые объекты, оказывается нельзя копировать.
Хотя очень странно, в шестой студии было можно, а щас нельзя! )))))))))))) | |
|
|
|
|
|
|
|
для: silart
(25.09.2007 в 09:46)
| | Ну, вообще, говоря если возвращаете объект через *this - конструктор копии обязателен - иначе это в конечном итоге приведёт к тому, что вы будете обращаться к разрушенному участку памяти. | |
|
|
|
|
|
|
|
для: cheops
(25.09.2007 в 10:45)
| | Ну операторы пришлось тоже немного видоизменить. Теперь они возвращают не объект, а ссылку на него.
Log& operator<<(const DOUBLE v)
{
fout << v;
return *this;
} | |
|
|
|