我有一个类实例的向量。这些实例中的每一个都有一个指向另一个类的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()
构造函数禁止默认的move构造函数。如果添加它,您的代码将变得格式良好。
以下是完整的工作代码供参考:
#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));
}
如果您需要一个唯一的指针,那么就使用一个唯一的指针。如果这使得包含unique_ptr的类移动--那就这样吧。
这里没有什么是不好的练习。