接口方法并返回指向this (enable_shared_from_this)的智能指针
Interface methods and returning smart pointer to this (enable_shared_from_this)
我有一个实现接口(LinkList
)的类(Geometry
)。在我的例子底部的代码显然是错误的,所以我正在考虑实现std::enable_shared_from_this
。Geometry
可以安全地从std::enable_shared_from_this<LinkList>
继承,我可以安全地改变getLinkList()
方法到shared_from_this()
吗?如果我的Geometry
类有它继承的多个接口会发生什么,我可以为所有的接口这样做吗?
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
}
我的例子底部的代码显然是错误的
代码没有明显的错误,错误是在getLinkedList
中,它将this
的所有权赋予shared_ptr
,导致当printList
返回并且最后一个shared_ptr对象超出范围时将其删除。因此,示例的最后一行相当不明显地错误,因为前一行巧妙地删除了对象。
Geometry
可以安全地继承std::enable_shared_from_this<LinkList>
是的,它只是一个基类。从它继承它几乎总是安全的(但这并不意味着你可以安全地使用它!)
,我可以安全地将
getLinkList()
方法更改为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)
)。
如果我的
Geometry
类有它继承的多个接口会发生什么,我可以为所有的接口这样做吗?
不,如果类有多个enable_shared_from_this
基类,那么shared_ptr
构造函数将不知道初始化哪个。我认为你会得到一个错误,由于歧义,或者如果没有enable_shared_from_this
基类都将持有一个空的weak_ptr
使它们无用。
:
您可以使Geometry
从enable_shared_from_this<Geometry>
派生(而不是从enable_shared_from_this<LinkList>
派生,也不是从每个接口派生),并定义:
shared_ptr<LinkList> Geometry::getLinkList()
{
return shared_from_this();
}
由shared_from_this()
返回的对象将隐式转换为shared_ptr<LinkList>
。首先,您仍然需要this
由shared_ptr
拥有。
- 表示"accepting anything for this template argument" C++概念的通配符
- 为什么使用 "this" 指针调用派生成员函数?
- C++错误:"error: int aaa::bbb is protected within this context"
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 关于C++中具有多重继承"this"指针的说明
- 在noexcept 规范中是否允许使用"this"?
- 如何修复"error: ‘_1’ was not declared in this scope"?
- C++调用具有 *this 属性的单个帮助程序函数
- Doees the 'this' 指针参与虚函数的多态行为
- 在 c++ 中正确定义"this"关键字?
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- QObject::连接无法将信号连接到*this*对象的插槽
- 析构函数中的"delete this"
- 为什么成员函数内的"this"指针为空?
- 为什么我需要在转换构造函数上引用 this->?
- "this"指针的值在对象的生存期内是否恒定?
- 引用 std::shared:ptr 以避免引用计数
- C++ "Invalid use of 'this' in non-member function" ,