Конечно, вы должны сами написать конструктор копирования и оператор присваивания.
Затем вы должны решить, какую семантику вы хотите иметь в копии. Итак:
TestStream test;
TestStream test2;
test2 << "foo"
test = test2;
test << "bar";
test2.str.str(); // should this be "foo" or "foobar" ?
Если вам нужна мелкая копия, ("foobar"
), вам нужно разделить объект stringstream между несколькими экземплярами TestStream
, вероятно, лучше всего использовать shared_ptr
для этого.
Если вам нужна глубокая копия ("foo"
), то вы можете скопировать так:
TestStream(const TestStream &rhs) : str(rhs.str.str()) {}
Или используйте один из вариантов в вопросе, на который вы ссылаетесь.
Это относится к потоку строк, которому вы занимаетесь , пишущему , когда вы берете копию. Если вы находитесь в середине чтения из него , или если вы пишете, но не можете писать до конца из-за использования seekp
, то вам нужно захватить текущее чтение / запишите позиции, а также данные в потоке строки, которые вы делаете с tellg/tellp
.
Возможно, вы также захотите скопировать состояние формата потока и т. Д., Что делает copyfmt
, и даже флаги ошибок (rdstate
- copyfmt
оставляет их в покое).