c++ - 移动持有 unique_ptr 的类实例
问题描述
我有一个类实例的向量。这些实例中的每一个都有一个指向另一个类的 unique_ptr。由于我从未尝试复制类实例甚至共享指针,我觉得 unique_ptr 比 shared_ptrs 更合适,因为指针不是共享的,而是只能通过类实例访问。
这是不好的做法吗?为什么这行不通?我知道将实例复制到唯一指针是不正确的,但是由于我移动它,我不明白为什么不允许这样做?
我必须创建一个自定义移动构造函数吗?它应该怎么做?
一旦从向量中删除对象实例,就应该删除唯一的 ptr,因为没有剩下的引用,对吧?
代码示例以便更好地理解:
class A {
private:
int number;
public:
void f() {
std::cout << "The number is: " << number;
}
A(int i) : number{i} {}
~A() = default;
};
class B {
std::unique_ptr<A> good_a;
B() : good_a{ std::make_unique<A>(1) } {}
~B() = default;
};
int main()
{
std::vector<B> all;
B my_b(123);
all.emplace_back(std::move(my_b));
}
解决方案
该答案侧重于您似乎遇到的编译错误。不好或好的做法留给其他人参与。
您的代码有几个错误,但主要错误似乎是您的自定义B( )
构造函数禁止默认移动构造函数。如果添加它,您的代码将变得格式良好。
这是一个完整的工作代码供参考:
#include <memory>
#include <vector>
class A {
private:
int number;
public:
void f();
A(int i) : number{i} {}
~A() = default;
};
struct B {
std::unique_ptr<A> good_a;
B(int k) : good_a{ std::make_unique<A>(k) } {}
B(B&& ) = default;
B& operator=(B&& ) = default; // not needed for the example, but good for completeness
};
int main()
{
std::vector<B> all;
B my_b(123);
all.emplace_back(std::move(my_b));
}
推荐阅读
- java - 在Java中,是否可以声明一个永远不会为空的字段?
- r - 获取行数差异的错误
- awk - 如果条件匹配,则在列条目旁边打印列标题
- java - 如何在集合操作中使用arrayUnion
- forms - 如何在提交前更新 MVC 表单
- junit - 使用 Mockito 模拟发布请求会引发 javax.ws.rs.ProcessingException:RESTEASY004655:无法调用请求
- php - 如何从 Laravel 中的 Session var 设置配置值
- excel - 根据下拉值隐藏工作表
- spring-mvc - java spring 无法同时设置带有标志 Samesite="None" 和安全标志的 setcookie 标头
- python - 是否有一种 Python 方式可以通过不同的网络命名空间执行 REST API 调用?