如何实例化智能指针类成员
How do you instantiate smart pointer class members?
我最近一直在做一些非常狡猾的智能指针编程,因为我从来没有真正理解移动构造函数、移动赋值等,因为在 MSDN 这样的地方给出的例子对我来说真的很复杂。通过狡猾,我的意思是字面上改变像(左值 + 0)这样的事情来制作右值。
这里有一个例子(我不擅长想出不深奥的场景):
class Person {
public:
Person(int age) {
age_ = age;
}
private:
int age_;
};
class Life {
public:
Life(int age) {
person_ = std::make_unique<Person>(age);
}
private:
std::unique_ptr<Person> person_;
};
年龄部分必须是右值,使它成为右值的正确方法是什么?我已经阅读了有关移动构造函数的信息,但它们似乎正在传递对象本身的右值引用?
编辑:另外,是否可以从类构造函数的成员初始值设定项列表中初始化智能指针成员?
只需执行以下操作,即可创建一个 Person 指针并将其分配给unique_ptr:
class Life {
public:
Life(int age) : person_(new Person(age)) {}
...
首先,如果你需要一个来自左值的右值,直接的方法是 std::move(a),就是这样,但重要的是要注意你在做什么。您正在将引用转换为 lvalue 的意思是"如果您需要,您可以更改它,因为我不再需要该值"。
但是在你的情况下,它们是右值还是左值真的无关紧要,因为你的int参数是一个逐个复制传递的值,这与你有一个Person(int&age)或Person(int&&age)无关紧要,什么不是你的情况。
但在这种情况下很重要
std::vector<int> b = ...
std::vector<int> a = b; //rvalue, means keep safe this data, I still need them
std::vector<int> a = std::move(b);//lvalue, could be changed
std::vector<int> a = f(); //lvalue, could be changed since is just a temporary data
相关文章:
- 从成员指针到整个结构/类的强制转换
- OOP 中的单成员指针
- 使用结构成员指针在C++中填充结构
- 聚合初始化,将成员指针设置为同一结构成员
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 共享 C++ 的数据成员指针
- 如何声明指向成员内容的成员指针m_pmd/m_pmf并访问它们?
- 从类C++外部调用指向成员方法的成员指针
- 结构成员指针是否自动初始化为零?
- 如何删除类内类类型的类成员指针
- 是否打印指向已定义 int 的成员指针
- 指向常量的成员指针
- 通过此指针访问时的成员差异和自身的成员指针(简单的 QT 示例问题)
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 将类成员指针传递给 Lambda 捕获列表 c++11
- 在单一实例类中将成员指针设置为 null 的正确方法是什么
- 无法删除在destructor中的成员指针的课程
- 删除对象而不调用成员指针的析构函数
- 当派生类的基类具有成员指针时,对其进行深层复制