请教一下为什么用静态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的地址,它们的地址确实是不同的,但这并不意味着它们指向的对象的成员变量不同。