我希望防止用户通过构造函数创建新实例,因此我将构造函数标记为私有方法。
更重要的是,我需要提供一个方法来返回用于自动管理实例生命周期的类型。我不希望用户直接使用Foo
类的实例,我希望他们总是使用std::shared_ptr<Foo>
。
#include <iostream>
#include <memory>
class Foo : public std::enable_shared_from_this<Foo> {
private: //the user should not construct an instance through the constructor below.
Foo(int num):num_(num) { std::cout << "Foo::Foon"; }
public:
Foo(const Foo&) = delete;
Foo(Foo&&) = default;
Foo& operator=(const Foo&) = delete;
Foo& operator=(Foo&&) = default;
public:
~Foo() { std::cout << "Foo::~Foon"; }
int DoSth(){std::cout << "hello world" << std::endl; return 0;}
std::shared_ptr<Foo> getPtr() { return shared_from_this();}
static std::shared_ptr<Foo> Create() {
Foo* foo = new Foo(5);
return std::shared_ptr<Foo>(foo);
}
private:
int num_;
};
int main()
{
auto sp = Foo::Create();
sp->DoSth();
Foo& foo = *sp.get();
auto sp1 = foo.getPtr();
Foo foo1(std::move(foo));
std::cout << sp.use_count() << std::endl;
}
我不确定我是否应该标记移动构造函数&将赋值操作符移为deleted
.
我在担心什么是有一个线程安全问题,如果一个线程正在调用move构造函数,而另一个线程正在调用一些成员函数在同一时间。你怎么看?
我认为你的问题不言自明。
紧随其后我不希望用户直接使用
Foo
类的实例,我希望他们总是使用std::shared_ptr<Foo>
。
Foo foo1(std::move(foo));
显示了直接使用Foo
实例的能力,而不是由共享指针管理。把move构造函数定义为deleted可以防止你希望用户避免的事情发生。