Я использую сторонний класс с (только) конструктором следующим образом
class foo // cannot be altered
{
public:
explicit foo(std::istream&);
...
};
и документация которого предлагает следующий подход
std::ifstream from("file.txt");
foo obj(from);
from.close();
Я не могу изменить foo
и хочу использовать его как член другого класса
class bar
{
foo obj; // must not be altered
public:
explicit
bar(std::string const&filename) // must not be altered
: obj(std::ifstream(filename)) // error: no matching constructor
{}
...
};
за исключением того, что это не работает, поскольку временный std::ifstream
, созданный из filename
, не гарантирует, что он проживет достаточно долго, чтобы построить foo obj
, и, следовательно, не может быть преобразован в std::istream&
(ситуация была бы другой, если бы foo::foo()
принял const std::istream&
).
Итак, мой вопрос: могу ли я заставить конструктор bar
работать, не меняя дизайн bar
(например, bar::bar()
, чтобы взять std::istream&
, или бар, чтобы удерживать std::unique_ptr<foo>
вместо foo
, или путем добавления элементов данных в bar
)?
bar
взятьstd::istream&
и передатьobj
? - person NathanOliver   schedule 20.08.2020bar
нежелательным образом. - person Walter   schedule 20.08.2020foo::foo
принялconst istream&
, вместо этого у вас было бы неопределенное поведение. По-моему, не улучшение. - person molbdnilo   schedule 20.08.2020bar
вы имеете в виду ... без изменения дизайнаfoo
? - person 463035818_is_not_a_number   schedule 20.08.2020foo
вообще, никаких изменений в базовом дизайнеbar
: тот же интерфейс конструктора, те же элементы. - person Walter   schedule 20.08.2020bar
удерживал объект ifstream, вы должны принять его в конструкторе.foo
требует lvalue, и единственный способ создать его на лету — использоватьnew
, но если вы не удерживаете указатель, у вас возникает утечка памяти. - person NathanOliver   schedule 20.08.2020bar
вmoo
изменением дизайна? - person 463035818_is_not_a_number   schedule 20.08.2020foo
не хранит поток, а использует его только для построения, все было бы в порядке - если бы вы могли читать из константного потока, но не можете. - person molbdnilo   schedule 20.08.2020mutable std::ifstream
и позволяет преобразовывать типconst
вstd::ifstream&
- это нормально? - person Walter   schedule 20.08.2020ifstream
член вbar
. - person NathanOliver   schedule 20.08.2020foo
- по крайней мере, компилятор clang больше не выдает ошибок. - person Walter   schedule 20.08.2020