- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在编写一个应该从抽象基类派生的类。我无法更改抽象基类。该类(class)将以 shared_ptr
的形式举行到抽象基类。继承抽象基类和可以吗 enable_shared_from_this
?像这样:
class IWidget {
public:
virtual ~IWidget(){}
// ...
};
class Widget : public std::enable_shared_from_this<Widget>, public IWidget {
protected:
Widget(); // protected, use create
public:
static std::shared_ptr<IWidget> create() {
return std::shared_ptr<IWidget>(new Widget(init));
}
// ...
};
更完整的代码here 似乎有效。
我能找到的大多数 enable_shared_from_this
的例子把它放在基类上。在这种情况下,我无法更改基类。使用多重继承并在派生类上使用可以吗?
我有点担心我只能保证enable_shared_from_this
仅当我创建 shared_ptr<Widget>
时才有效但在这种情况下,我正在创建一个 shared_ptr<IWidget>
.
更新:我注意到的一件有趣的事情是,如果我更改 create
方法:
IWidget* w = new Widget(init);
return std::shared_ptr<IWidget>(w);
我在尝试使用 shared_from_this()
时遇到运行时错误.我认为这是有道理的。 shared_ptr
有 a templated constructor这需要一个“可转换”指针。除非 shared_ptr
构造函数知道它正在使用 Widget
它不知道它来自 enable_shared_from_this
它不能存储 weak_ptr
.我只是想知道这种行为是否被记录在案。
最佳答案
是的,没问题。
shared_ptr
has a templated constructor that takes a "convertible" pointer. And unless theshared_ptr
constructor knows it is taking aWidget
it doesn't know it derives fromenable_shared_from_this
and it can't store aweak_ptr
.
完全正确。
I just wonder if this behaviour is documented.
在当前标准中,enable_shared_from_this
的规定非常差,但请参阅 P0033 了解新的和改进的 enable_shared_from_this
规范,它将在 C++17 中。以及回答“如果你做两次会发生什么?”问题,修改后的措辞具体说明了如何使用 enable_shared_from_this
基类,以及如何初始化 weak_ptr
成员。新措辞的那部分只是对现有实践进行标准化,即它只是对实际实现已经做了什么的更准确的描述。 (“如果你做两次会发生什么?”问题的答案与以前的实现有所不同,但有充分的理由,这与你的问题无关)。
新规范阐明了您的原始示例完全定义明确且正确。
当前标准表示,当您调用 shared_from_this()
时,您更新的问题中的修改版本具有未定义的行为,因为违反了拥有指向派生指针的 shared_ptr
的前提条件(因为您创建了一个拥有该指针的 shared_ptr
- 到基地)。然而,正如论文中所解释的那样,该前提条件不足以确保合理的语义。修改后的措辞使您的修改版本也明确定义(即没有未定义的行为),但基类中的 weak_ptr
不会与 shared_ptr<IWidget>
共享所有权,因此 shared_from_this()
将引发异常(这是您从实现中观察到的)。
关于c++ - 从 std::enable_shared_from_this 和抽象基类派生可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34372352/
类中使用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() 调用是否也需要太多时间? 查看文档,
我是一名优秀的程序员,十分优秀!