如何在 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_uniquecreate(const QString& file)
调用 create(file)
是一个无限递归循环,这就是编译器警告您的内容。 std::make_unique<Reader1>(...);
调用 Reader1
构造函数,将 ...
传递给它。因此,无论Reader1
构造函数需要什么,您都需要传递给make_unique<Reader1>()
。无论是要读取的文件名,还是从其他地方获得的实际文件数据。我们无法为您回答这个问题,因为您提供的类定义没有定义构造函数!
我感到困惑的部分是我只有默认构造函数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_ptr
到Reader
。
@chris 我正在从程序的其他地方调用 create,但仍然收到相同的错误“未使用的函数‘create’。”
@Kau,根据我的经验,编译器非常擅长不给出未使用函数警告的误报。也许你正在调用不同的create
函数。真的,我所说的一切都是猜测,因为该问题没有 minimal reproducible example 可以用来重现您收到的警告。以上是关于如何在 C++ 中使用 std::unique_ptr?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual C++ 2010 中使用 C++ 库 [重复]