从类成员返回智能指针的正确方法?

The right way to return a smart pointer from a class member?

本文关键字:方法 指针 成员 返回 智能      更新时间:2023-10-16

我正在尝试在 person 类中编写单例模式,这使我能够为该类创建一个实例,并且可以在程序的任何地方使用它。

以下是类:

// The declaration
class Person {
static unique_ptr<Person> instance;
Person() = default;
Person(Person&) = delete;
Person& operator=(const Person&) = delete;
~Person() = default;
public:
static unique_ptr<Person> getInstance();
};
// The implementation   
unique_ptr<Person> instance = NULL;
unique_ptr<Person> Person::getInstance() {
if (instance == NULL) {
instance = unique_ptr<Person>(new Person());
}
return instance;
}

但是它给我这个错误的问题:Error C2280 'std::unique_ptr<Person,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function

不幸的是,我不明白这个问题,我不知道如何解决?

std::unique_ptr的复制构造函数被隐式删除,因为它具有显式定义的移动构造函数。

从 C++11 标准 12.8 复制和移动类对象:

7 如果类定义未显式声明复制构造函数,则隐声明一个。如果类定义声明移动构造函数或移动赋值运算符,则隐式声明的复制构造函数定义为已删除;否则,它被定义为默认值 ([dcl.fct.def])。

您可以通过以下方式解决问题:

  1. 返回对Person的引用。

    static Person& getInstance();
    
    Person& Person::getInstance()
    {
    static Person p;
    return p;
    }
    
  2. 返回shared_ptr<Person>.

    static std::shared_ptr<Person> getInstance();
    
    std::shared_ptr<Person> Person::getInstance()
    {
    static std::shared_ptr<Person> p(new Person);
    return p;
    }
    

我推荐第一种解决方案,因为它更简单。

PS请注意,它们都不需要使用static成员变量instance