在下面的代码中,我如何从下面的Object::get
函数返回相同的对象。请查看该函数中的注释。
函数返回具有给定id
的新Object
的std::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
。