Информация об изменениях

Сообщение Re[2]: Deleter unique_ptr для ostream от 19.04.2023 8:43

Изменено 19.04.2023 8:44 _agg

Re[2]: Deleter unique_ptr для ostream
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, _agg, Вы писали:


_>>но нужно было отложить инициализацию и сделать что то вроде вот этого:

_>>
_>>std::unique_ptr < OSTREAM > pstm;
_>>pstm = new std::ofstream("file.txt", std::ios::app);
_>>


R>Оператор присваивания тоже можно использовать (как альтернативу reset, про который сказали выше), но для этого в правой части оператора присваивания нужно скорструировать unique_ptr:


R>
R>pstm = std::make_unique<OSTREAM>("file.txt", std::ios::app);
R>


R>что равнозначно следующиему:


R>
R>    pstm = std::unique_ptr<OSTREAM>(new OSTREAM("file.txt", std::ios::app));
R>


R>P.S. Ну и мелкое замечание: если уже заведен макрос OSTREAM, то его следует либо использовать регулярно, либо не использовать вообще. А если будет в одном месте OSTREAM, а в другом std::ofstream, то можно получить нежданчик, если вдруг в один прекрасный день кто-то подредактирует это макроопределение.



Внимательнее читайте, этот макрос объявлен в библиотеке, и эта библиотека использует этот поток, а пользователь библиотеки уже сам назначает куда же этот std::ostream будет писать, поэтому и было написано таким образом:
//объявление  OSTREAM это std::ostream 
std::unique_ptr<OSTREAM> ostm;
...
//инициализация 
ostm.reset(new std::ofstream("file.txt", std::ios::app))   // это рабочий вариант

//вот это не рабочий вариант потому что OSTREAM это std::ostream а инициализировать его нужно файлов потоком std::ofstream
pstm = std::make_unique<OSTREAM>("file.txt", std::ios::app)
Re[2]: Deleter unique_ptr для ostream
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, _agg, Вы писали:


_>>но нужно было отложить инициализацию и сделать что то вроде вот этого:

_>>
_>>std::unique_ptr < OSTREAM > pstm;
_>>pstm = new std::ofstream("file.txt", std::ios::app);
_>>


R>Оператор присваивания тоже можно использовать (как альтернативу reset, про который сказали выше), но для этого в правой части оператора присваивания нужно скорструировать unique_ptr:


R>
R>pstm = std::make_unique<OSTREAM>("file.txt", std::ios::app);
R>


R>что равнозначно следующиему:


R>
R>    pstm = std::unique_ptr<OSTREAM>(new OSTREAM("file.txt", std::ios::app));
R>


R>P.S. Ну и мелкое замечание: если уже заведен макрос OSTREAM, то его следует либо использовать регулярно, либо не использовать вообще. А если будет в одном месте OSTREAM, а в другом std::ofstream, то можно получить нежданчик, если вдруг в один прекрасный день кто-то подредактирует это макроопределение.



Внимательнее читайте, этот макрос объявлен в библиотеке, и эта библиотека использует этот поток, а пользователь библиотеки уже сам назначает куда же этот std::ostream будет писать, поэтому и было написано таким образом:
//объявление  OSTREAM это std::ostream 
std::unique_ptr<OSTREAM> ostm;
...
//инициализация 
ostm.reset(new std::ofstream("file.txt", std::ios::app))   // это рабочий вариант

//вот это не рабочий вариант потому что OSTREAM это std::ostream а инициализировать его нужно файловым потоком std::ofstream
pstm = std::make_unique<OSTREAM>("file.txt", std::ios::app)