如何把"这个"变成标准::unique_ptr?



在下面的代码中,我如何从下面的Object::get函数返回相同的对象。请查看该函数中的注释。

函数返回具有给定id的新Objectstd::unique_ptr。但是,如果id与对象的id相同,或者如果对象的id被设置为error,则应该返回this指针(即,相同的对象(。那么,如何从Object::get函数返回相同的对象呢?

#include <set>
#include <memory>
#include <iostream>
class IObject
{
public:
virtual std::unique_ptr<IObject> get(std::string id) = 0;
virtual void fun() = 0;
virtual ~IObject() {}
};
class Object : virtual public IObject
{
public:
Object(std::string id) : id_(id) {}
virtual std::unique_ptr<IObject> get(std::string i)
{
if((id() == i) || (id() == "error")) {
// Return the same object
//return this; // How to achieve this? How to return the same object?
return std::make_unique<Object>(id()); // This does not return the same object.
}
if(ids.end() == ids.find(i)) {
return std::make_unique<Object>("error");
}
return std::make_unique<Object>(i);
}
virtual void fun()
{
std::cout << "Object is: " << id() << std::endl;
}
std::string const& id() const
{
return id_;
}
private:
static std::set<std::string> const ids;
std::string id_;
};
std::set<std::string> const Object::ids{"id0", "id1", "id2", "id3"};

int main()
{
auto o = std::make_unique<Object>("id0");
o->get("id1")->get("id2")->get("id3")->fun();
o->get("id1")->get("idN")->get("id2")->fun();
o->get("id1")->get("idN")->get("id2")->get("id3")->fun();
o->get("id1")->get("id2")->get("id2")->fun();
o->get("id1")->get("id2")->get("id2")->get("id3")->fun();
return 0;
}

问题的答案很简单。

return std::unique_ptr<Object>(this);

然而,正如尼科尔在回答中指出的那样,这几乎肯定不是你想要的。

考虑以下代码:

Object foo("foo");
foo.get();

轰!您刚刚在一些未在堆上分配的内存上调用了free

unique_ptr表示对象的唯一所有权。该类型被设计为使得恰好并且只有一个unique_ptr管理该对象的生存期;这就是为什么它被称为"独一无二"。

因此,如果某人已经对this对象拥有唯一所有权,则不能将其赋予其他人唯一所有权。因为那样就不会是唯一所有权。你甚至不能给this的当前所有者唯一的所有权,因为那样他们就会在两个地方拥有它。

你想要的不是一件合理的事情。你要么想要共享所有权语义(因此应该使用shared_ptr或类似的enable_shared_from_this(,要么不希望函数返回unique_ptr

相关内容

  • 没有找到相关文章

最新更新