首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从现有的istream或类本身创建的istream初始化成员istream

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

Stack Overflow用户
提问于 2017-05-28 17:17:46
回答 1查看 827关注 0票数 2

我正在试图找出如何让单个成员变量表示在istream中传递的变量或类自己创建的变量。

我认为,如果我动态地分配类创建的istream,那么使用指向该istream的指针就可以了;但是,问题是,unique_ptr将尝试释放非动态分配的内存。

下面是一些代码,它们复制了我所拥有的问题:

代码语言:javascript
复制
#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,这将导致错误。我知道我可能需要一个以上的成员

代码语言:javascript
复制
#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");
}

但我想知道是否有办法只用一个成员变量

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-28 17:45:46

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

代码语言:javascript
复制
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;
};

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44230004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档