- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个实现接口(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 fromstd::enable_shared_from_this<LinkList>
是的,它只是一个基类。从它继承几乎总是安全的(但这并不意味着您可以安全地使用它!)
and can I safely change the
getLinkList()
method toshared_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>
.你还需要 this
由 shared_ptr
拥有不过首先。
关于c++ - 接口(interface)方法和返回指向此的智能指针(enable_shared_from_this),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25086324/
类中使用shared_ptr()的问题 当我们先定义一个指针,然后再用这个指针构造两个智能指针 int main() { int* pt = new int(); std::shared_
我有两个类A和B,其中B是A的子类。我需要两个类都可以使用std::enable_shared_from_this。 我尝试了这个: #include #include #include cla
我正在尝试在模板函数中使用 std::enabled_shared_from_this 函数,但在类中调用 shared_from_this() 时不断收到消息 bad_weak_ptr 错误。 te
我有以下类结构用于管理具有不同原型(prototype)的回调: class MethodHandlerBase: public std::enable_shared_from_this{ publi
我的类继承自多个基类,其中之一是 std::enable_shared_from_this .必须是第一垒吗? 假设以下示例代码: struct A { ~A(); }; struct B { ~B(
我找到的关于 enable_shared_from_this 的例子显示它通过继承使用。例如: struct Good : enable_shared_from_this { shared_p
在公开继承 enable_shared_from_this 并初始化类的对象后,在调用该类的另一个函数时,我在 Visual Studio 中调试时仍然可以看到 enable_shared_from_
我在阅读 Boost.Asio 示例时遇到了 enable_shared_from_this,在阅读了文档之后,我仍然不知道如何正确使用它。有人可以给我一个例子和解释什么时候使用这个类是有意义的。 最
这个问题在这里已经有了答案: What is the usefulness of `enable_shared_from_this`? (6 个答案) 关闭 8 年前。 我正在查看 shared_p
当我继承std::enable_shared_from_this,但是我创建了一个unique_ptr,std::enable_shared_from_this里面的weak_ptr也会被初始化吗当我
这个问题在这里已经有了答案: What is the usefulness of `enable_shared_from_this`? (6 个答案) 关闭 6 年前。 我是 C++11 的新手,我
我有一个对象 (Z),它派生自另外两个对象(A 和 B)。 A 和 B 都派生自 enable_shared_from_this<> ,分别enable_shared_from_this和 enabl
有没有办法阻止 shared_from_this() 调用堆栈分配的对象? 基类列表中的 enable_shared_from_this<> 是类用户的强指标,但有没有办法强制正确使用? 示例代码:
为什么我应该使用 enable_shared_from_this 因为我也可以通过简单的赋值获得相同的效果。 struct A : std::enable_shared_from_this { std
我正在使用 enable_shared_from_this然后从 Base 继承.尝试使用 shared_from_this() 时在 Derived的构造函数(不是初始化列表),我得到一个异常。原来
我有一个继承自 enable_shared_from_this 的类型,以及从该类型继承的另一种类型。现在我不能使用 shared_from_this 方法,因为它返回基类型,并且在特定的派生类方法中
我在阅读 Boost.Asio 示例时遇到了 enable_shared_from_this,在阅读了文档之后,我仍然不知道应该如何正确使用它。有人可以给我一个例子和解释什么时候使用这个类是有意义的。
要点回顾 继承自 std::enable_shared_from_this<T> 的类能够在其自身实例中通过 std::shared_from_this 方法创建一个指向自己的
这个问题在这里已经有了答案: Double inheritance of enable_shared_from_this (3 个回答) 1年前关闭。 当我尝试运行此代码时,我得到 bad_weak_
我不知道这个问题是否适合 SO,但我们开始了: 启用 shared_from_this 时,是否会增加可执行文件的大小?解决 shared_from_this() 调用是否也需要太多时间? 查看文档,
我是一名优秀的程序员,十分优秀!