【问题标题】:How do I use std::unique_ptr in C++?如何在 C++ 中使用 std::unique_ptr?
【发布时间】:2020-03-20 19:31:47
【问题描述】:

我要做的是使用std::unique_ptr 来打开三种不同类型的文件(.rdr.rrd.drr),它们都具有基类Reader。基类以及三个阅读器类如下:

class Reader
{
protected:
  vector<Read> _reads;
}

class Reader1 : public Reader
{
private:
  int num;
};

class Reader2 : public Reader 
{
private:
  int num;
};

class Reader3 : public Reader
{
private:
  int num;
};

我需要帮助的是实现以下功能:

static std::unique_ptr<Reader> create(const QString& file) {
// code here
}

这是我目前的尝试:

static std::unique_ptr<Reader> create(const QString& file)
{
    return std::unique_ptr<Reader> (create(file)); // gives the error 'all paths through this function will call itself'
}

这就是我调用函数的方式:

if (tmp == "rdr") {
    file = createTempFile();

    auto readerfile = Reader::create(fileName);

我想我不太明白 unique_ptr 的工作原理,这可能是我无法实现此功能的原因。

【问题讨论】:

  • file创建Reader的实际逻辑在哪里?我想它应该在构造函数中......但没有。
  • 你的意思是create函数的实现在哪里?
  • 我的意思是,您的 create 函数调用...本身。无条件的。虽然它应该做一些逻辑来实际创建。

标签: c++ class inheritance static-methods


【解决方案1】:

create() 的实现应该类似于

static std::unique_ptr<Reader> create(const QString& file) {
    if (file == "<string for Reader1>")
       return std::make_unique<Reader1>(...);
    ...
}

【讨论】:

  • (...) 中的括号内应该包含什么?我试着把 std::make_unique(create(file));但仍然得到相同的错误“通过此函数的所有路径都将调用自身。”谢谢!
  • @Kau create(const QString&amp; file) 调用 create(file) 是一个无限递归循环,这就是编译器警告您的内容。 std::make_unique&lt;Reader1&gt;(...); 调用 Reader1 构造函数,将 ... 传递给它。因此,无论Reader1 构造函数需要什么,您都需要传递给make_unique&lt;Reader1&gt;()。无论是要读取的文件名,还是从其他地方获得的实际文件数据。我们无法为您回答这个问题,因为您提供的类定义没有定义构造函数!
  • 我感到困惑的部分是我只有默认构造函数Reader1() = default;,所以我不太确定 (...) 里面会包含什么。我尝试什么都不传递,然后得到错误“未使用的函数'create'”。感谢您的帮助,谢谢!
【解决方案2】:

您需要Reader 的构造函数,然后您可以创建/制作unique_ptr 并从函数返回。

例如,

class Reader {
public:
Reader() = default;
Reader(std::string filename) {...}
...
};

std::unique_ptr<Reader> create(std::string filename) {
    return std::make_unique<Reader>(std::move(filename)); //requires C++17
}

【讨论】:

  • 现在它给了我警告“未使用的函数'create'。”我想我确实需要使用 create 函数。
  • @Kau,您可以从程序中的其他位置调用create,以接收unique_ptrReader
  • @chris 我正在从程序的其他地方调用 create,但仍然收到相同的错误“未使用的函数‘create’。”
  • @Kau,根据我的经验,编译器非常擅长不给出未使用函数警告的误报。也许你正在调用不同的create 函数。真的,我所说的一切都是猜测,因为该问题没有 minimal reproducible example 可以用来重现您收到的警告。
猜你喜欢
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 2021-08-08
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多