c++ shared_ptr使用问题

c++用智能指针初始化返回私有构造函数成员报错,请求各位帮忙指点一下


#include 
#include   
using namespace std;

class Generator
{
public:
    typedef shared_ptr Pointer;
    Pointer create() {return (new Generator())};   //报错: 不存在从 "Generator *" 转换到 "std::shared_ptr" 的适当构造函数C/C++(415)
    ~Generator();
private:
    Generator();
};

Generator::Generator()
{

}

Generator::~Generator()
{
}
int main()
{
    Generator::Pointer pGenerator(Generator::create());
    
}

基于Monster 组和GPT的调写:
你的代码中,存在以下两个问题:

Generator::create() 函数返回的是一个原始指针类型,但是你的 Generator::Pointer 类型是一个 std::shared_ptr 类型。因此,需要将原始指针转换为 std::shared_ptr 类型,可以使用 std::shared_ptr 的构造函数来完成,如下所示:

Pointer create() {return std::shared_ptr<Generator>(new Generator());};


在 create() 函数中创建 Generator 类型的对象之后,需要将其传递给 std::shared_ptr 类型的智能指针对象,这样智能指针才能对其进行内存管理。因此,需要将上面的语句修改为如下形式:

Pointer create() {return Pointer(new Generator());};


修改后的代码如下所示:

#include <iostream>
#include <memory> 
using namespace std;
 
class Generator
{
public:
    typedef shared_ptr<Generator> Pointer;
    Pointer create() {return Pointer(new Generator());};
    ~Generator();
private:
    Generator();
};
 
Generator::Generator()
{
 
}
 
Generator::~Generator()
{
}
int main()
{
    Generator::Pointer pGenerator(Generator::create());
}


该回答引用GPTᴼᴾᴱᴺᴬᴵ
在你的代码中,返回类型是一个裸指针 Generator* ,但你试图将它转换为 shared_ptr,因此会出现编译错误。解决这个问题的一种方法是使用 make_shared() 来创建 shared_ptr 对象。修改代码如下:

#include <iostream>
#include <memory>
using namespace std;

class Generator
{
public:
    typedef shared_ptr<Generator> Pointer;
    static Pointer create() { return make_shared<Generator>(); }
    ~Generator();

private:
    Generator();
};

Generator::Generator() {}

Generator::~Generator() {}

int main()
{
    Generator::Pointer pGenerator(Generator::create());
    return 0;
}


这样修改后,你应该可以正常编译并运行程序了。