Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么可以';我不能创建流缓冲区的副本吗?_C++ - Fatal编程技术网

C++ 为什么可以';我不能创建流缓冲区的副本吗?

C++ 为什么可以';我不能创建流缓冲区的副本吗?,c++,C++,当我上这门课时: class mystreambuf : public std::streambuf { public: mystreambuf(const std::streambuf& other) : std::streambuf(other) { } }; 可编译,但当我尝试执行此操作时,不会打印任何内容: mystreambuf buf(*std::cout.rdbuf()); std::cout.rdbuf(&buf); std::cout

当我上这门课时:

class mystreambuf : public std::streambuf
{
public:
    mystreambuf(const std::streambuf& other) : std::streambuf(other)
    {
    }
};
可编译,但当我尝试执行此操作时,不会打印任何内容:

mystreambuf buf(*std::cout.rdbuf());
std::cout.rdbuf(&buf);

std::cout << "Hello";
mystreambuf-buf(*std::cout.rdbuf());
标准::cout.rdbuf(&buf);

std::cout流缓冲区规范中没有任何内容说明,如果以这种方式复制流缓冲区,则副本将继续从同一设备读/写,也没有指定
cout
,以使其来自
rdbuf()
的结果将按照您的要求运行

streambuf本质上是一个接口,它的复制构造函数不会以某种方式实际调用实现该接口的任何类的复制构造函数。多态类型不能按值保存、复制、传递等。为了复制多态类型,必须使用虚拟的
clone()
成员函数,并且
streambuf
接口不包含任何此类方法

为了复制
cout
使用的streambuf,您必须使用其动态类型访问它,即使这样,它也可能不可复制:例如,访问同一设备的多个流缓冲区可能需要以某种方式进行协调或同步,streambuf实现可能不允许复制,这样它就可以安全地避免进行同步


我想做的是创建一个流缓冲区,它具有std::cout的流缓冲区的所有特性,但是内置了额外的成员函数(供我使用)。你知道怎么做吗


你想增加什么额外的特征?可能是实现streambuf不是添加功能的合适位置


如果希望streambuf接口的实现转发到先前存在的streambuf,则可以创建一个streambuf类,该类保存streambuf指针,将其正确地视为指向多态类型的指针,并通过转发对内部streambuf的调用来实现streambuf接口。这是一个非常简单的实现:

#include <iostream>

struct copiable_streambuf : std::streambuf {
    std::streambuf *buf; // non-owning pointer

    copiable_streambuf(std::streambuf *buf) : buf(buf) {}

    std::streambuf::int_type overflow(std::streambuf::int_type c) {
        buf->sputc(c);
        return 0;
    }
};

int main()
{
    copiable_streambuf buf (std::cout.rdbuf());
    std::ostream os(&buf);
    os << "Hello, World!\n";
}

流缓冲区规范中没有任何内容说明,如果以这种方式复制流缓冲区,那么副本将继续从同一设备读/写,也没有指定
cout
,以使其来自
rdbuf()
的结果按您的要求运行

streambuf本质上是一个接口,它的复制构造函数不会以某种方式实际调用实现该接口的任何类的复制构造函数。多态类型不能按值保存、复制、传递等。为了复制多态类型,必须使用虚拟的
clone()
成员函数,并且
streambuf
接口不包含任何此类方法

为了复制
cout
使用的streambuf,您必须使用其动态类型访问它,即使这样,它也可能不可复制:例如,访问同一设备的多个流缓冲区可能需要以某种方式进行协调或同步,streambuf实现可能不允许复制,这样它就可以安全地避免进行同步


我想做的是创建一个流缓冲区,它具有std::cout的流缓冲区的所有特性,但是内置了额外的成员函数(供我使用)。你知道怎么做吗


你想增加什么额外的特征?可能是实现streambuf不是添加功能的合适位置


如果希望streambuf接口的实现转发到先前存在的streambuf,则可以创建一个streambuf类,该类保存streambuf指针,将其正确地视为指向多态类型的指针,并通过转发对内部streambuf的调用来实现streambuf接口。这是一个非常简单的实现:

#include <iostream>

struct copiable_streambuf : std::streambuf {
    std::streambuf *buf; // non-owning pointer

    copiable_streambuf(std::streambuf *buf) : buf(buf) {}

    std::streambuf::int_type overflow(std::streambuf::int_type c) {
        buf->sputc(c);
        return 0;
    }
};

int main()
{
    copiable_streambuf buf (std::cout.rdbuf());
    std::ostream os(&buf);
    os << "Hello, World!\n";
}

流缓冲区规范中没有任何内容说明,如果以这种方式复制流缓冲区,那么副本将继续从同一设备读/写,也没有指定
cout
,以使其来自
rdbuf()
的结果按您的要求运行

streambuf本质上是一个接口,它的复制构造函数不会以某种方式实际调用实现该接口的任何类的复制构造函数。多态类型不能按值保存、复制、传递等。为了复制多态类型,必须使用虚拟的
clone()
成员函数,并且
streambuf
接口不包含任何此类方法

为了复制
cout
使用的streambuf,您必须使用其动态类型访问它,即使这样,它也可能不可复制:例如,访问同一设备的多个流缓冲区可能需要以某种方式进行协调或同步,streambuf实现可能不允许复制,这样它就可以安全地避免进行同步


我想做的是创建一个流缓冲区,它具有std::cout的流缓冲区的所有特性,但是内置了额外的成员函数(供我使用)。你知道怎么做吗


你想增加什么额外的特征?可能是实现streambuf不是添加功能的合适位置


如果希望streambuf接口的实现转发到先前存在的streambuf,则可以创建一个streambuf类,该类保存streambuf指针,将其正确地视为指向多态类型的指针,并通过转发对内部streambuf的调用来实现streambuf接口。这是一个非常简单的实现:

#include <iostream>

struct copiable_streambuf : std::streambuf {
    std::streambuf *buf; // non-owning pointer

    copiable_streambuf(std::streambuf *buf) : buf(buf) {}

    std::streambuf::int_type overflow(std::streambuf::int_type c) {
        buf->sputc(c);
        return 0;
    }
};

int main()
{
    copiable_streambuf buf (std::cout.rdbuf());
    std::ostream os(&buf);
    os << "Hello, World!\n";
}

流缓冲区规范中没有规定,如果以这种方式复制流缓冲区,则副本将继续从同一设备读/写,也没有指定
cout
,因此
rdbuf()
的结果将按照