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

How do I use std::unique_ptr in C++?

我想做的是使用 std::unique_ptr 来打开三种不同类型的文件(.rdr.rrd.drr),所有其中有基数 class Reader。基础 class,以及三个 reader classes,如下:

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 是如何工作的,这可能就是我在实现它时遇到问题的原因。

您对 create() 的实现应该类似于

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

您需要 Reader 的构造函数,然后您可以 create/make 从函数中得到 unique_ptr 和 return。

例如,

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
}