unique_ptr 与重载构造函数一起使用
Use of unique_ptr with overloaded constructor
我有一个关于如何将 unique_ptr
与重载构造函数一起使用的问题。
这是我的 class 定义:
class circle : public segment
{
public:
circle()
{
center.x = 0;
center.y = 0;
};
circle(const double r, const point c)
{
radius = r;
center.x = c.x;
center.y = c.y;
segment_id = 2;
};
~circle() {};
double get_radius() { return radius; };
point get_center() { return center; };
double get_length() { return 3.14 * radius; }; //returns circumference
private:
double radius = 0;
point center;
};
这就是我想要创建指针的方式:
std::unique_ptr<circle(radius1, center1)> myCircle;
但是,我的编译器 (MS VisualStudio 2019) 不接受它。它只接受 std::unique_ptr<circle> MyCircle
。如何使用我的自定义构造函数初始化该指针?
应该是
auto /* std::unique_ptr<circle> */ myCircle = std::make_unique<circle>(radius1, center1);
请理解,您在这里的目的究竟是什么:
std::unique_ptr<circle(radius1, center1)> myCircle;
std::unique_ptr 是一个 class 模板。您提供的模板参数必须是一个类型(不是一般的全部真相,但在这里它是),而不是一个类型的实例!但是您正在尝试传递 class 圈子的一个实例(临时)。所以这个模板要求的类型应该是单独的圆圈。
为了 Jarod42 回答的完整性:C++14 之前的方法:
std::unique_ptr<circle> myCircle = std::unique_ptr<circle>(new circle(radius1, center1));
虽然这种旧语法在异常安全方面比 make_unique 推荐的方法弱,但它更明确地说明了正在发生的事情(堆分配、构造函数调用“position”)。
我有一个关于如何将 unique_ptr
与重载构造函数一起使用的问题。
这是我的 class 定义:
class circle : public segment
{
public:
circle()
{
center.x = 0;
center.y = 0;
};
circle(const double r, const point c)
{
radius = r;
center.x = c.x;
center.y = c.y;
segment_id = 2;
};
~circle() {};
double get_radius() { return radius; };
point get_center() { return center; };
double get_length() { return 3.14 * radius; }; //returns circumference
private:
double radius = 0;
point center;
};
这就是我想要创建指针的方式:
std::unique_ptr<circle(radius1, center1)> myCircle;
但是,我的编译器 (MS VisualStudio 2019) 不接受它。它只接受 std::unique_ptr<circle> MyCircle
。如何使用我的自定义构造函数初始化该指针?
应该是
auto /* std::unique_ptr<circle> */ myCircle = std::make_unique<circle>(radius1, center1);
请理解,您在这里的目的究竟是什么:
std::unique_ptr<circle(radius1, center1)> myCircle;
std::unique_ptr 是一个 class 模板。您提供的模板参数必须是一个类型(不是一般的全部真相,但在这里它是),而不是一个类型的实例!但是您正在尝试传递 class 圈子的一个实例(临时)。所以这个模板要求的类型应该是单独的圆圈。
为了 Jarod42 回答的完整性:C++14 之前的方法:
std::unique_ptr<circle> myCircle = std::unique_ptr<circle>(new circle(radius1, center1));
虽然这种旧语法在异常安全方面比 make_unique 推荐的方法弱,但它更明确地说明了正在发生的事情(堆分配、构造函数调用“position”)。