c++ - 具有 unique_ptr 的受保护析构函数
问题描述
我正在尝试从第三方库调用 API。
当我想将 unique_ptr 与具有受保护析构函数的类一起使用时会遇到麻烦。
这是示例,
#include <memory>
#include <iostream>
using namespace std;
class Parent {
public:
Parent () //Constructor
{
cout << "\n Parent constructor called\n" << endl;
}
protected:
~ Parent() //Dtor
{
cout << "\n Parent destructor called\n" << endl;
}
};
class Child : public Parent
{
public:
Child () //Ctor
{
cout << "\nChild constructor called\n" << endl;
}
~Child() //dtor
{
cout << "\nChild destructor called\n" << endl;
}
};
Parent* get() {
return new Child();
}
int main(int argc, char const* argv[])
{
Parent * p1 = get(); // this is ok
std::unique_ptr<Parent> p2(get()); // this is not ok
return 0;
}
我正在尝试将 unique_ptr 与 Parent 类一起使用。但是编译器抛出了错误
/usr/include/c++/5/bits/unique_ptr.h: In instantiation
of ‘void std::default_delete<_Tp>::operator()(_Tp*) const
[with _Tp = Parent]’:
/usr/include/c++/5/bits/unique_ptr.h:236:17: required
from ‘std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp
= Parent; _Dp = std::default_delete<Parent>]’
main.cpp:38:35: required from here
main.cpp:12:5: error: ‘Parent::~Parent()’ is protected
~ Parent() //Dtor
^
In file included from /usr/include/c++/5/memory:81:0,
from main.cpp:2:
/usr/include/c++/5/bits/unique_ptr.h:76:2: error: within
this context
delete __ptr;
关于摆脱这个问题的任何想法?我不能破解 Parent 和 Child 类,因为它们是第三方库的类。
解决方案
您可以交std::default_delete<Parent>
朋友Parent
来修复该错误。您可能还想在通过指针ing 派生类~Parent
virtual
时避免未定义的行为。delete
Parent
例如:
class Parent {
friend std::default_delete<Parent>;
// ...
protected:
virtual ~Parent();
// ...
然而,Parent
设计清楚地表明你不应该delete
通过Parent
指针,这就是为什么析构函数是非公共的。阅读虚拟性了解更多详情:
准则 #4:基类析构函数应该是公共的和虚拟的,或者是受保护的和非虚拟的。
你可能想引入另一个中间基类来解决这个问题:
class Parent { // Comes from a 3rd-party library header.
protected:
~Parent();
};
struct MyParent : Parent { // The intermediate base class.
virtual ~MyParent();
};
class Derived : public MyParent {};
std::unique_ptr<MyParent> createDerived() {
return std::unique_ptr<MyParent>(new Derived);
}
int main() {
auto p = createDerived();
}
推荐阅读
- python - 尝试生成虚拟 DataFrame 但出现错误
- c# - 创建一个 EntryPoint.Invoke(null, null); 在 MethodInfo 下并调用它
- groovy - 在声明性 Jenkins 管道中存储环境变量中的值列表
- mysql - 逐一获取列数据
- r - 从 R 调用 openmp 的 C 代码给出不一致的结果
- php - 如何从gmail API的邮件中提取PHP中的html数据?
- mule - 如何在不使用 API 管理器的情况下在 Mule 4 中配置 CORS?
- angular - 为什么在导入文本编码 polyfill 后在 IE11 中出现“ReferenceError: 'TextEncoder' is undefined”?
- vhdl - Altera Cyclone III 片上 ram 延迟
- sql - 存在失败进入存储过程