Перемещение потока в класс c’tor

#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]);