我如何在 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
}
我想做的是使用 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
}