C++复制流对象

Mat*_*sen 9 c++ compiler-errors stream

我一直在尝试使用C++,我遇到了一个我不知道如何解决的问题.

基本上,我发现你不能复制流(请参阅为什么不允许复制stringstream?),这也适用于"包装"它们的对象.例如:

  • 我创建了一个类型为stringstream的数据成员的类.
  • 我创建了这个类的对象.
  • 我试图复制对象,例如"TestObj t1; TestObj t2; t1 = t2;"

这导致错误C2249:

'std :: basic_ios <_Elem,_Traits> :: operator =':虚拟基础'std :: basic_ios <_Elem,_Traits>'中声明的私有成员的无法访问路径

所以我的问题是:我怎样(最好是容易)复制具有*stream类型数据成员的对象?

完整示例代码:

#include <iostream>
#include <string>
#include <sstream>

class TestStream
{
public:
    std::stringstream str;
};

int main()
{
    TestStream test;
    TestStream test2;
    test = test2;

    system("pause");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

提前致谢.

UPDATE

感谢下面的答案,我设法解决了这个问题.我所做的是声明流对象一次,然后使用包装器对象中的指针(例如,TestStream)简单地引用它们.具有私有拷贝构造函数的所有其他对象也是如此.

Dav*_*rtz 5

不允许复制流的原因是复制流没有意义.如果你解释一下你想要做什么,那肯定有办法做到这一点.如果您想要复制一大块数据,请使用字符串.但是流更像是连接而不是字符串.

  • 如果我想复制_连接_怎么办?即,我正在读取一个文件,并且到达了我知道稍后必须读取的一行(或一组要存储的大行)。复制流会很方便,以便副本位于流中的该位置,然后能够稍后返回。 (2认同)

rub*_*nvb 0

您可以做两件事,都需要注意谁拥有该对象:

  1. 存储对流的引用,并确保只要您的这些类存在,该对象就不会超出范围。

  2. 复制指针,并确保仅当最后一个类完成指向的流对象时才删除。

两者是等效的,尽管我个人更喜欢参考方法。

  • @Darokthar 同意。这是“boost::shared_ptr”合适的一种情况(并且绝对比任何替代方案更可取)。 (3认同)