#c #stream #ofstream
#c #поток #ofstream
Вопрос:
В основном я запустил ofstream
вот так:
std::ofstream to(ar&v[2]);
Теперь я хочу переместить его (не копию) в мой конструктор классов следующим образом:
class MyClass{
std::ofstream output;
MyClass(const std::ofstream amp;output=std::cout) output(output): {}
};
Но при этом появляется много ошибок, есть идеи, почему это происходит?
Ответ №1:
Вместо перемещения ostream
вы должны взять ссылку на него. Кроме того, ваш класс должен содержать a, ostreamamp;
иначе созданный по умолчанию MyClass
не будет работать. Кроме того, конструктор должен принимать ostreamamp;
, вместо const ofstreamamp;
, вот так:
class MyClass{
std::ostream amp;output;
public:
MyClass(std::ostream amp;output = std::cout) : output(output) {}
};
Вот демонстрационная версия.
Ответ №2:
Ваш код завершается с ошибкой, потому что вы пытаетесь сделать копию ofstream
, но потоки C не копируются.
Если вы используете C 11 или более позднюю версию, вы можете использовать фактическую семантику перемещения, например
class MyClass{
std::ofstream output;
public:
MyClass(std::ofstream amp;amp;output) : output(std::move(output)) {}
};
...
std::ofstream to(ar&v[2]);
MyClass cls(std::move(to));
В противном случае используйте вместо этого ссылку или указатель, не являющийся владельцем (просто убедитесь, что поток переживет ваш класс):
class MyClass{
std::ofstream amp;output;
public:
MyClass(std::ofstream amp;output) : output(output) {}
};
...
std::ofstream to(ar&v[2]);
MyClass cls(to);
class MyClass{
std::ofstream *output;
public:
MyClass(std::ofstream *output) : output(output) {}
};
...
std::ofstream to(ar&v[2]);
MyClass cls(amp;to);
Или вы могли бы просто изменить свой конструктор, чтобы использовать имя файла вместо ранее существующего потока:
class MyClass{
std::ofstream output;
public:
MyClass(const char *filename) : output(filename) {}
};
...
MyClass cls(ar&v[2]);