首页 > 解决方案 > 如何将 'this' 变成 std​​::unique_ptr?

问题描述

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

该函数返回一个带有给定std::unique_ptr的 new 。但是如果 与对象的相同或对象的设置为,则应返回指针(即相同的对象)。那么如何从函数中返回相同的对象呢?ObjectididididerrorthisObject::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;
}

标签: c++c++11unique-ptr

解决方案


你的问题的答案很简单。

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

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

考虑以下代码:

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

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


推荐阅读