Как мне использовать std :: unique_ptr в C ++? - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь использовать 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, возможно, поэтому я возникли проблемы с его реализацией.

Ответы [ 2 ]

4 голосов
/ 20 марта 2020

Ваша реализация create() должна выглядеть примерно так:

static std::unique_ptr<Reader> create(const QString& file) {
    if (file == "<string for Reader1>")
       return std::make_unique<Reader1>(...);
    ...
}
0 голосов
/ 20 марта 2020

Вам нужен конструктор для 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
}

...