关于#c++#的问题:请教一下为什么用静态create方法返回智能指针,三个地址不同的智能指针,打印该类成员值相同,代码如下:#include <iostream>

请教一下为什么用静态create方法返回智能指针,三个地址不同的智能指针,打印该类成员值相同,代码如下:


#include 
#include   
using namespace std;

class Generator
{
public:
    typedef shared_ptr<Generator> Pointer;
    static Pointer create() {return (Pointer)(new Generator()) ;}    
    int getData() const {return mdata;}
    void setData(int data) {mdata = data;}
    ~Generator();
private:
    Generator();
    int mdata;
};

Generator::Generator():mdata(1)
{
    // cout<<"construct Generator \n"<
}

Generator::~Generator()
{
    // cout<<"destruct Generator \n"<
}

int main()
{
    Generator::Pointer pGenerator = Generator::create();
    cout<getData()<//打印  1
    pGenerator->setData(100);//修改值为100
    cout<getData()<//打印  100

    Generator::Pointer pGenerator1 = Generator::create();
    cout<getData()<//打印  100
    
    Generator::Pointer pGenerator2(Generator::create());
    cout<getData()<//打印  100
    
    cout<//0x20bb090 0x20bb0d0 0x20bb110
}


你下面调用的还是pGenerator而不是pGenerator1

智能指针是对对象进行管理的,并不会重新创建一个新的对象。用 create() 方法创建一个新的智能指针时,实际上返回的是同一个对象的指针,不同的智能指针共享同一个内存区域,即它们所管理的对象是同一个对象。
如果想要创建多个相互独立的对象,可以使用多个 create() 方法来创建它们。每次调用 create() 方法时,都会创建一个新的对象,并返回一个指向该对象的智能指针

参考GPT和自己的思路,在你的代码中,每次调用Generator::create()都会创建一个新的Generator对象并返回一个智能指针,这意味着每个指针都指向不同的对象,因此它们的地址应该不同。你在最后打印三个智能指针的地址,它们确实是不同的。

然而,你在打印对象的成员值时,每次都打印的是pGenerator指针指向的对象的成员值,而不是pGenerator1和pGenerator2指向的对象的成员值。因此,无论你用哪个指针打印成员值,你都会得到相同的结果,因为它们指向同一个对象。

如果你想打印不同对象的成员值,你需要使用不同的指针来访问它们,例如:

Generator::Pointer pGenerator = Generator::create();
cout << pGenerator->getData() << endl; // 打印 1
pGenerator->setData(100);
cout << pGenerator->getData() << endl; // 打印 100

Generator::Pointer pGenerator1 = Generator::create();
cout << pGenerator1->getData() << endl; // 打印 1

Generator::Pointer pGenerator2 = Generator::create();
cout << pGenerator2->getData() << endl; // 打印 1

这里,每个指针都指向不同的对象,因此它们的成员值也不同。

回答不易,还请采纳!!!

该回答引用GPTᴼᴾᴱᴺᴬᴵ
在你的代码中,你创建了三个不同的智能指针,它们分别是pGenerator、pGenerator1和pGenerator2,它们的地址是不同的,因为它们是三个不同的对象。然而,你在使用它们时,都是通过箭头操作符访问它们所指向的对象的成员变量。因此,当你调用pGenerator、pGenerator1和pGenerator2的getData()函数时,都返回了同样的结果,因为它们所指向的对象的成员变量mdata的初始值都是1,且pGenerator已经被修改为100。因此,不论你打印哪一个智能指针所指向的对象的成员变量,都会输出100。
·
需要注意的是,你在代码最后使用了cout语句打印了pGenerator、pGenerator1和pGenerator2的地址,它们的地址确实是不同的,但这并不意味着它们指向的对象的成员变量不同。