c++ - 如何将 'this' 变成 std::unique_ptr?
问题描述
在下面的代码中,我如何从Object::get
下面的函数返回相同的对象。请查看该函数中的注释。
该函数返回一个带有给定std::unique_ptr
的 new 。但是如果 与对象的相同或对象的设置为,则应返回指针(即相同的对象)。那么如何从函数中返回相同的对象呢?Object
id
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
了一些未在堆上分配的内存
推荐阅读
- r - 如何从 TBATS 预测中提取趋势分量?
- java - Scala 和 Java 中的注释约定 "// $example on:" 和 "// $example off:"
- c++ - 比较有符号和无符号整数
- date - Automator:将修改日期复制到文件创建日期
- ssh-tunnel - 如何在 Jelastic 中启用 AllowTcpForwarding?
- linux - 使用 --background 启动-停止守护程序与使用 & 选项运行
- xml - 编辑后如何在 xml 文件中保留重音符号?
- c# - 如何:将 aspx(非 Razor)从 MVC3 迁移到 MVC5
- javascript - React Context API,数据加载两次。一次有数据,一次没有
- google-cloud-platform - 错误:gcloud 崩溃(ServerNotFoundError):无法在 www.googleapis.com 找到服务器