Sté*_*hen 18 c++ gcc boost shared-ptr c++11
我有一个宠物项目,我用它来试验C++ 11的新功能.虽然我有C的经验,但我对C++还不熟悉.为了训练自己进入最佳实践,(除了阅读很多),我已经启用了一些严格的编译器参数(使用GCC 4.4.1):
-std=c++0x -Werror -Wall -Winline -Weffc++ -pedantic-errors
Run Code Online (Sandbox Code Playgroud)
这对我来说很好.到现在为止,我已经能够解决所有障碍.但是,我有需要enable_shared_from_this,这给我带来了问题.编译我的代码时可能会收到以下警告(在我的情况下是错误的)(可能由触发器引发-Weffc++):
base class ‘class std::enable_shared_from_this<Package>’ has a non-virtual destructor
Run Code Online (Sandbox Code Playgroud)
所以基本上,我对这个实现有点疑虑enable_shared_from_this,因为:
enable_shared_from_this.但我正在寻找解决这个问题的方法,所以我的问题是,是否有正确的方法来解决这个问题?并且:我认为这个析构函数是假的,或者它有真正的目的吗?
Jam*_*lis 25
用于子类化的类的析构函数应始终是虚拟的,恕我直言.
只有在通过指向基类的指针删除派生类的实例时,才需要基类中的虚拟析构函数.
在类中包含任何虚函数(包括析构函数)都需要开销.Boost(以及TR1和C++ 11标准库)不希望强迫您只是因为需要能够shared_ptr从this指针获取a而产生这种开销.
析构函数是空的,为什么要它呢?
如果您没有用户定义的构造函数,编译器会为您提供一个构造函数,因此它并不重要.
我无法想象有人会想通过引用删除他们的实例
enable_shared_from_this.
究竟.
至于编译器警告,我会忽略警告或禁止它(在代码中注释解释你为什么这样做).偶尔,特别是在"迂腐"的警告级别,编译器警告是无益的,我会说这是其中一种情况.
我同意Jame的描述,但会补充一下
只有在想要虚拟地销毁该类的实例时才需要虚拟析构函数.情况并非总是如此,但是如果基本类不打算被破坏,那么它应该防止它
所以我会改变
用于子类化的类的析构函数应始终是虚拟的,恕我直言.
这是:
用于子类化的类的析构函数应始终是虚拟的或受保护的.
| 归档时间: |
|
| 查看次数: |
4420 次 |
| 最近记录: |