sách gpt4 ai đã đi

c++ - 从现有的 istream 或类本身创建的 istream 初始化成员 istream

In lại 作者:搜寻专家 更新时间:2023-10-31 01:32:02 25 4
mua khóa gpt4 Nike

我正在尝试弄清楚如何让一个成员变量代表传入的 istream 或类自己创建的成员变量。

我认为,如果我动态分配类创建的 istream,那么使用指向 istream 的指针可能会起作用;然而,问题在于 unique_ptr 将尝试释放非动态分配的内存。

下面是一些重现我遇到的问题的代码:

#include 
#include
#include
#include

class example {
công cộng:
explicit example(std::istream& i)
: m_input(&i)
{}
explicit example(const std::string& path)
: m_input(new std::ifstream(path))
{}
riêng tư:
std::unique_ptr m_input;
};

int chính() {
example e1(std::cin);
example e2("./test.txt");
}

e1 将尝试释放 std::cin,这会导致错误。我知道我可以使用多个成员,例如

#include 
#include
#include
#include

class example {
công cộng:
explicit example(std::istream& i)
: m_i(),
m_input(&i)
{}
explicit example(const std::string& path)
: m_i(path),
m_input(&m_i)
{}
riêng tư:
std::ifstream m_i;
std::istream *m_input;
};

int chính() {
example e1(std::cin);
example e2("./test.txt");
}

但我想知道是否有一种方法可以只用一个成员变量来做到这一点

1 Câu trả lời

我想您可能会通过存储指向流的指针来扩展您的方法:

class X {
công cộng:
explicit X(std::istream& stream)
: stream(&stream, [](std::istream* stream){})
{}

explicit X(const std::string& path)
: stream(new std::ifstream(path),
[](std::istream* stream) { delete stream; })
{}

riêng tư:
using StreamDeleter = std::function;

std::unique_ptr stream;
};

只需添加一个自定义删除器。在现有流的情况下,它什么也不做。相反,如果流是手动创建的,它会释放流。

关于c++ - 从现有的 istream 或类本身创建的 istream 初始化成员 istream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44230004/

25 4 0
Bài viết được đề xuất: c++ - 临时实例的生命周期是多少?
Bài viết được đề xuất: c++ - 标准 shared_pointer_cast 未定义
Bài viết được đề xuất: c++ - 参与 std::vector C++
Bài viết được đề xuất: c++ - 关闭 boost::process child 的标准输入
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com