3

シリアル化する必要がある 2 つのクラス (私の質問に関連) を持つプロジェクトに取り組んでいます。しばらくの間、クラスの 1 つが正常にコンパイルされ、もう 1 つのクラスが次の警告でコンパイルされました。

...\boost\mpl\print.hpp(51): warning C4308: negative integral constant converted to unsigned type

両方とも、Boost クラス エクスポータを使用してクラスを登録していたので、後で次のように、それらのインスタンスへの基本クラス ポインタを安全にシリアライズできました。

BOOST_CLASS_EXPORT_GUID(ClassName, "ClassName")

そのため、2 つのクラスの違いをゆっくりと解消したところ、警告の原因は次のとおりであることがわかりました。静かにコンパイルされたクラスには仮想デストラクタがありました。これは、独自のデストラクタを必要とする可能性がある他のクラスから継承させることを計画していたためです。

今のところ、他のクラスにも仮想デストラクタを与えただけですが、継承するつもりはないので、これは奇妙に思えます。

私の質問は、クラスに仮想デストラクタを与えるとこの警告が「修正」されるのはなぜですか?また、警告は実際にはどういう意味ですか? BOOST_CLASS_EXPORT_GUID マクロの一部が、自分のクラスなどから継承するクラスを作成していますか?

4

1 に答える 1

3

この質問を投稿したばかりですが、解決策の少なくとも一部を認識しただけかもしれません。

BOOST_CLASS_EXPORT_GUID マクロは、子クラスのインスタンスへの基本クラス ポインターを含む構造体をシリアル化する必要がある場合に、基本クラスから継承するクラスを "登録" するためのものです。のようなポインター

BaseClass* base;// = new BaseClass()
BaseClass* derived;// = new DerivedClass()

ポリモーフィズムのために、明示的にキャストせずに。

また、クラスが継承される場合は、(私が思うに) 仮想デストラクタを指定して、派生クラスが自分自身でクリーンアップできるようにするのが最も安全です。

ただし、コンパイルに問題があったクラスから継承するつもりはなかったので、BOOST_CLASS_EXPORT_GUID でエクスポートしても意味がありませんでした。そのため、悪い習慣についての警告を受け取りました。後で継承しないクラスをエクスポートしないでください。

于 2012-10-02T05:23:31.830 に答える