在这种情况下,我应该将移动构造函数和移动赋值运算符标记为已删除吗?



我希望防止用户通过构造函数创建新实例,因此我将构造函数标记为私有方法。

更重要的是,我需要提供一个方法来返回用于自动管理实例生命周期的类型。我不希望用户直接使用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可以防止你希望用户避免的事情发生。

相关内容

  • 没有找到相关文章

最新更新