Сообщение 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, Вы писали:
_>>но нужно было отложить инициализацию и сделать что то вроде вот этого:
_>>
R>Оператор присваивания тоже можно использовать (как альтернативу reset, про который сказали выше), но для этого в правой части оператора присваивания нужно скорструировать unique_ptr:
R>
R>что равнозначно следующиему:
R>
R>P.S. Ну и мелкое замечание: если уже заведен макрос OSTREAM, то его следует либо использовать регулярно, либо не использовать вообще. А если будет в одном месте OSTREAM, а в другом std::ofstream, то можно получить нежданчик, если вдруг в один прекрасный день кто-то подредактирует это макроопределение.
Внимательнее читайте, этот макрос объявлен в библиотеке, и эта библиотека использует этот поток, а пользователь библиотеки уже сам назначает куда же этот std::ostream будет писать, поэтому и было написано таким образом:
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, Вы писали:
_>>но нужно было отложить инициализацию и сделать что то вроде вот этого:
_>>
R>Оператор присваивания тоже можно использовать (как альтернативу reset, про который сказали выше), но для этого в правой части оператора присваивания нужно скорструировать unique_ptr:
R>
R>что равнозначно следующиему:
R>
R>P.S. Ну и мелкое замечание: если уже заведен макрос OSTREAM, то его следует либо использовать регулярно, либо не использовать вообще. А если будет в одном месте OSTREAM, а в другом std::ofstream, то можно получить нежданчик, если вдруг в один прекрасный день кто-то подредактирует это макроопределение.
Внимательнее читайте, этот макрос объявлен в библиотеке, и эта библиотека использует этот поток, а пользователь библиотеки уже сам назначает куда же этот std::ostream будет писать, поэтому и было написано таким образом:
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)