【发布时间】:2017-10-29 00:37:08
【问题描述】:
我试图弄清楚如何拥有一个成员变量,它要么代表传入的 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");
}
但我想知道是否有一种方法可以只使用一个成员变量
【问题讨论】:
-
流不可复制?我错过了你的问题吗?
-
@πάνταῥεῖ 对,它们是不可复制的,所以我需要一个成员,它是指针或对传入流的引用。但是,这与我创建自己的流的构造函数发生冲突,因为如果我想使用相同的成员变量(它是一个指针),我必须动态分配。这样做的问题是我只在字符串构造函数中动态分配指针,因此,当我尝试解除分配时,如果
example是从现有的istream构造的,那将是一个错误。有意义吗? -
不,这些东西没有意义,抱歉。请详细说明您的用例和您真正想要解决的问题。
-
@πάνταῥεῖ 好吧,如果我不清楚,对不起。我有一个需要从输入流中读取的类。我的目标是我希望能够从现有输入流或文件路径初始化该类的输入流。
-
为什么你需要使用文件路径的构造函数呢?如果只是为了方便,我会删除它以保持接口和实现简单。
example类的用户已经可以创建std::ifstream(可以从文件路径构造)并将其传递给example类。
标签: c++ file c++11 pointers memory