如何在 C++ 中使用 std::unique_ptr?

Posted

技术标签:

【中文标题】如何在 C++ 中使用 std::unique_ptr?【英文标题】:How do I use std::unique_ptr in C++? 【发布时间】: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 函数调用...本身。无条件的。虽然它应该做一些逻辑来实际创建。 【参考方案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 可以用来重现您收到的警告。

以上是关于如何在 C++ 中使用 std::unique_ptr?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 如何在 C++ 中使用 dlopen()?

如何在 Visual C++ 2010 中使用 C++ 库 [重复]

在 windows 中,如何使用 c++ 检查端口是不是免费

如何在 C++ 中正确使用命名空间?

如何在 C++ 中使用 CPR 库?

当python使用“Python.h”调用该c++进程时,如何在python中停止一个c++进程