20

C++11の新機能を試すペットプロジェクトがあります。私はCの経験がありますが、C++にはかなり慣れていません。ベストプラクティスを習得するために(たくさん読む以外に)、いくつかの厳密なコンパイラーパラメーターを有効にしました(GCC 4.4.1を使用)。

-std=c++0x -Werror -Wall -Winline -Weffc++ -pedantic-errors

これは私にとってはうまくいきました。今まで、私はすべての障害を解決することができました。しかし、私にはが必要でenable_shared_from_thisあり、これが私に問題を引き起こしています。コードをコンパイルすると、次の警告(私の場合はエラー)が表示されます(おそらくによってトリガーされます-Weffc++)。

base class ‘class std::enable_shared_from_this<Package>’ has a non-virtual destructor

したがって、基本的に、私はこの実装に少しバグがありますenable_shared_from_this。理由は次のとおりです。

  • サブクラス化を目的としたクラスのデストラクタは、常に仮想である必要があります、IMHO。
  • デストラクタは空ですが、なぜそれがあるのですか?
  • を参照してインスタンスを削除したいと思う人はいないと思いますenable_shared_from_this

しかし、私はこれに対処する方法を探しているので、私の質問は本当に、これに対処する適切な方法はありますか?そして:私はこのデストラクタが偽物であると考えるのは正しいですか、それともそれに本当の目的がありますか?

4

3 に答える 3

27

サブクラス化を目的としたクラスのデストラクタは、常に仮想である必要があります。

基本クラスの仮想デストラクタは、派生クラスのインスタンスが基本クラスへのポインタを介して削除される場合にのみ必要です。

クラス内にデストラクタを含む仮想関数を含めるには、オーバーヘッドが必要です。Boost (および TR1 と C++11 標準ライブラリ) は、ポインターshared_ptrからa を取得できるようにする必要があるという理由だけで、そのオーバーヘッドを強制することを望んでいません。this

デストラクタは空ですが、なぜそれがあるのでしょうか?

ユーザー定義のコンストラクターがない場合は、コンパイラーが提供するので、特に問題はありません。

を参照してインスタンスを削除したいと思う人がいるとは思えませんenable_shared_from_this

丁度。

コンパイラの警告については、警告を無視するか、抑制します (コードにコメントを付けて、その理由を説明します)。ときどき、特に「ペダンティック」な警告レベルでは、コンパイラの警告が役に立たないことがあります。これはそのようなケースの 1 つです。

于 2010-04-03T16:33:38.650 に答える
10

私はジェームズの説明に同意しますが、追加します

仮想デストラクタは、そのクラスのインスタンスを仮想的に破棄する場合にのみ必要です。これは常に当てはまるとは限りませんが、基本クラスが仮想的に破棄されることを意図していない場合は、それから保護する必要があります

だから私は変わるだろう

サブクラス化を目的としたクラスのデストラクタは、常に仮想である必要があります。

これは次のとおりです。

サブクラス化を目的としたクラスのデストラクタは、常にvirtualまたはprotectedである必要があります。

于 2010-04-03T17:00:50.063 に答える
4

これに対処する適切な方法はありますか?

常に使用しないでください-Weffc++。コードをチェックするために時々オンにすると便利ですが、実際には永続的に使用する必要はありません。それは偽陽性を与え、最近では実際には維持されていません. ときどき使用しますが、いくつかの警告を無視しなければならない場合があることに注意してください。理想的には、マイヤーズの本のすべてのアドバイスを暗記するだけで、とにかくそれは必要ありません;-)

このデストラクタは偽物だと思うのは正しいですか、それとも本当の目的がありますか?

いいえ、それは偽物ではなく、本当の目的があります。 定義されていない場合publicは、明示的に として宣言されるのを防ぐために、 として暗黙的に宣言されprotectedます。

于 2012-05-06T15:13:42.660 に答える