我正在试图找出如何让单个成员变量表示在istream中传递的变量或类自己创建的变量。
我认为,如果我动态地分配类创建的istream,那么使用指向该istream的指针就可以了;但是,问题是,unique_ptr将尝试释放非动态分配的内存。
下面是一些代码,它们复制了我所拥有的问题:
#include <iostream>
#include <fstream>
#include <memory>
#include <string>
class example {
public:
explicit example(std::istream& i)
: m_input(&i)
{}
explicit example(const std::string& path)
: m_input(new std::ifstream(path))
{}
private:
std::unique_ptr<std::istream> m_input;
};
int main() {
example e1(std::cin);
example e2("./test.txt");
}e1将尝试释放std::cin,这将导致错误。我知道我可能需要一个以上的成员
#include <iostream>
#include <fstream>
#include <memory>
#include <string>
class example {
public:
explicit example(std::istream& i)
: m_i(),
m_input(&i)
{}
explicit example(const std::string& path)
: m_i(path),
m_input(&m_i)
{}
private:
std::ifstream m_i;
std::istream *m_input;
};
int main() {
example e1(std::cin);
example e2("./test.txt");
}但我想知道是否有办法只用一个成员变量
发布于 2017-05-28 17:45:46
我想您可以通过存储指向流的指针扩展您的方法:
class X {
public:
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; })
{}
private:
using StreamDeleter = std::function<void(std::istream* stream)>;
std::unique_ptr<std::istream, StreamDeleter> stream;
};只需添加自定义删除器即可。在现有流的情况下,它什么也不做。相反,如果流是手动创建的,它就会释放流。
https://stackoverflow.com/questions/44230004
复制相似问题