gpt4 book ai didi

c++ - 接口(interface)方法和返回指向此的智能指针(enable_shared_from_this)

转载 作者:行者123 更新时间:2023-11-30 02:44:47 26 4
gpt4 key购买 nike

我有一个实现接口(interface) ( Geometry ) 的类 ( LinkList )。我示例底部的代码显然是错误的,所以我正在考虑实现 std::enable_shared_from_this .可以Geometry安全地继承自 std::enable_shared_from_this<LinkList>我可以安全地更改 getLinkList() 吗? shared_from_this() 的方法?如果我的 Geometry 会发生什么类有多个它继承的接口(interface),我可以对所有接口(interface)都这样做吗?

class Link
{
public:
std::string getName() { return "the name"; }
};
class LinkList
{
public:
virtual Link* getLink(int id) = 0;
virtual int size() = 0;
};
class Geometry : LinkList
{
private:
int state;
public:
void doSomething() { state = 1; }
virtual Link* getLink(int id) { return new Link(); }
virtual int size() { return 1; }
std::shared_ptr<LinkList> getLinkList() { return std::shared_ptr<LinkList>(this); }
};

void printList(std::shared_ptr<LinkList> linkList)
{
for (int i = 0; i < linkList->size(); i++)
{
std::cout << linkList->getLink(i)->getName() << std::endl;
}
}

void main()
{
Geometry* geom = new Geometry();
printList(geom->getLinkList());
geom->doSomething(); // Error here
}

最佳答案

The code at the bottom of my example is obviously wrong

那里的代码没有明显错误,bug在getLinkedList这给出了 this 的所有权到 shared_ptr导致它在 printList 时被删除返回并且最后一个 shared_ptr 对象超出范围。所以这个例子的最后一行是相当不明显的错误,因为前一行巧妙地删除了对象。

Can Geometry safely inherit from std::enable_shared_from_this<LinkList>

是的,它只是一个基类。从它继承几乎总是安全的(但这并不意味着您可以安全地使用它!)

and can I safely change the getLinkList() method to shared_from_this()?

仅当 Geometry对象属于 shared_ptr ,并且在您的代码中不是:

Geometry* geom = new Geometry();

您需要将指针存储在 shared_ptr 中(最好在创建它时立即)enable_shared_from_this基类可用,所以这应该没问题:

auto geom = std::make_shared<Geometry>();
printList(geom->shared_from_this());
geom->doSomething();

(当然,使用 shared_from_this() 是毫无意义的,因为无论如何您已经有了 sahred_ptr 并且可以使用 printList(geom) )。

What happens if my Geometry class has multiple interfaces that it inherits, can I do this for all of the interfaces?

否,如果类(class)有多个enable_shared_from_this基类然后是shared_ptr构造函数不知道要初始化哪个。我想你会因为歧义而得到一个错误,或者如果不是 enable_shared_from_this基类都将包含一个空的 weak_ptr使它们变得无用。

更新:

你可以制作Geometry派生自 enable_shared_from_this<Geometry> (不是来自 enable_shared_from_this<LinkList> 也不是来自每个接口(interface)),并定义:

shared_ptr<LinkList> Geometry::getLinkList()
{
return shared_from_this();
}

shared_from_this()返回的对象将隐式转换为 shared_ptr<LinkList> .你还需要 thisshared_ptr 拥有不过首先。

关于c++ - 接口(interface)方法和返回指向此的智能指针(enable_shared_from_this),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25086324/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com