суббота, 15 октября 2011 г.

Запрещайте явно операцию присвоения и конструктор копирования

Сегодня решил написать функцию в своем мини-фреймворке. Смысл этой функции вернуть объект std::fstream по заданному имени. Какого же было мое удивление, что нельзя вызвать операцию присвоения, но об этом я узнал в результате экспериментов. До них ругалось и ругалось так, что не совсем понятно что делать?

Вот код банальной функции:
#include

void Class1::Method1()
{
   std::fstream file1;
   std::fstream file2 = file1;
}

Ругается так:

1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\fstream(934) : error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits
1>        ]
1>        c:\program files (x86)\microsoft visual studio 9.0\vc\include\ios(151) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits
1>        ]
1>        This diagnostic occurred in the compiler generated function 'std::basic_fstream<_Elem,_Traits>::basic_fstream(const std::basic_fstream<_Elem,_Traits> &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits
1>        ]
1>Generating Code...

Что на мой взгляд не совсем описательно. Было бы куда лучше, если бы авторы класса std::fstream реализовали класс:

class NonCopyable
{
protected:
    NonCopyable()    {};
    ~NonCopyable()   {};
private:
    NonCopyable( const NonCopyable& );
    NonCopyable& operator=( const NonCopyable& );
};

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

Комментариев нет: