gpt4 book ai didi

c++ - 通过智能指针赋值给类成员

转载 作者:搜寻专家 更新时间:2023-10-31 00:27:22 24 4
gpt4 key购买 nike

我对 C++ 还是很陌生,在探索智能指针时,有一种行为我无法完全理解。

考虑以下简单类:

class Student {

public:
int studentID;
string gender;
string name;

Student(int studentID, string gender, string name)
{
this->studentID = studentID;
this->gender = std::move(gender);
this->name = std::move(name);
}

unique_ptr<string> getNameUnique()
{
return make_unique<string>(this->name);
}

string* getNamePtr()
{
return &name;
}

};

在主代码中,如果我获取指向实例的name 的智能指针并尝试修改它,它不会工作:

auto nameUniquePtr = mary.getNameUnique();
cout << "Before: " << mary.name << "\n";
cout << "Before (through pointer): " << *nameUniquePtr << "\n";
*nameUniquePtr = "Tracy";
cout << "After: " << mary.name << "\n";
cout << "After (through pointer): " << *nameUniquePtr << "\n\n";

产生:

Before: Mary
Before (through pointer): Mary
After: Mary
After (through pointer): Tracy

显然,maryname 成员没有改变。在单步调试工具时,我发现智能指针指向的地址和成员的实际地址根本不一样。但是,如果我直接获取指向同一成员的指针并尝试更改它的值,它会起作用:

auto namePtr = mary.getNamePtr();
cout << "Before: " << mary.name << "\n";
cout << "Before (through pointer): " << *namePtr << "\n";
*namePtr = "Tracy";
cout << "After: " << mary.name << "\n";
cout << "After (through pointer): " << *namePtr << "\n\n";

产生:

Before: Mary
Before (through pointer): Mary
After: Tracy
After (through pointer): Tracy

即使我直接设置一个指向成员的智能指针变量,通过它改变值,还是不行:

auto directPtr = make_unique<string>(mary.name);
cout << "Before: " << mary.name << "\n";
*directPtr = "Jessica";
cout << "After: " << mary.name << "\n\n";

产生:

Before: Tracy
After: Tracy

在使用智能指针指向类成员时,是否有一些规范或限制?谢谢。

最佳答案

当你做的时候

return make_unique<string>(this->name);

您没有返回指向 name 的指针您创建一个 std::unique_ptr<std::string>拥有自己的std::string那是 name 的拷贝.它与 name 完全分开.

您可以创建一个 unique_ptr有一个空删除器并用指向 name 的指针构造它但是当你可以简单地返回 name 时,这是很多工作通过引用获取它的句柄。


我还想指出您应该使用 member initialization list初始化你的类(class)成员。您正在做的是在构造函数主体中进行分配,但效率不高。对你来说,这看起来像

Student(int studentID, string gender, string name) : studentID(studentID), gender(std::move(gender)), name(std::move(name)) {}

关于c++ - 通过智能指针赋值给类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49451516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com