у меня есть такая структура
struct X{
ostream out;
X() : out(cout) {}
...
};
и я заметил, что я должен определиться с & правильно передать cout в качестве параметра по умолчанию: ostream &out; Я не знаю почему, и я не знаю, есть ли другие возможности сохранить ostream без &, Кроме того, когда я пытаюсь установить
X x;
ofstream out;
x.out = out;
компилятор обнаружил много ошибок … Я хочу иметь возможность установить X :: out для cout или ofstream. Как это сделать?
ostreams не могут быть переданы по значению. Вы должны пройти по ссылке или указателю.
Если вы хотите умение сделать x.out
ссылаться на различные потоки в течение его времени жизни, а затем сделать его указателем. В противном случае сделайте это ссылкой.
Лучшее, что вы можете сделать, это изменить дизайн вашего класса, чтобы вам больше не нужно инициализировать переменную-член. Копирование предотвращается компилятором, решения, основанные на указателях, приведут к проблемам владения, std::shared_ptr
создает проблемы с std::cout
и ссылочный член создаст возможность висячих ссылок.
Попробуйте реорганизовать ваш код так, чтобы поток всегда передавался как ссылка на методы извне, когда это необходимо:
struct X{
X() {}
void f(std::ostream &os);
};
Объект потока не может быть скопирован, вам нужно использовать ссылку.
struct X{
ostream& out;
X() :out( std::cout ) {}
// X( ostream& out_ = std::cout ) : out( out_ ) {}
};