- ベストアンサー
CException についてVC6とVC2005とのコンパイルの違い
こんにちわ、お世話になります。 現在、Windows XPにて、VC++6.0からVC++2005へと あるソフトの移植をしているのですが、 CException についてコンパイルエラーが出ています。 試しに、 -- CException* pException = new CException; delete pException; -- の様な文を書いて、VC++6.0とVC++2005とでコンパイルを 比較してみました。 すると思惑通り、VC++2005でだけ、以下の様なエラーが 出てしまいます。 -- error C2259: 'CException' : 抽象クラスをインスタンス化できません。 1> 次のメンバが原因です: 1> 'CException::~CException(void)' : は抽象型です -- ヘルプを見てもエラーが出るのは納得なのですが、 それならなぜVC++6.0の時には出なかったのでしょうか? 以上、よろしくお願い致します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> そう思って afx.h を見てみたのですが、VC++6.0、VC++2005とも > virtual となっていました。 VC++2005のほうは、デストラクタが純粋仮想関数になっていませんか? (=0がついていませんでしたか?)
その他の回答 (4)
- redfox63
- ベストアンサー率71% (1325/1856)
> 「newで直接作成しないでください。」 は 2001/10版のMSDNのドキュメントに記載されています WEB版の方には記載はないようです
- hidebun
- ベストアンサー率50% (92/181)
あ、それから、オブジェクトを削除方法について。 http://msdn.microsoft.com/ja-jp/library/97z4sxfb.aspx CException オブジェクトを削除するときは、Delete メンバ関数で例外を削除します。delete 演算子を直接呼び出さないでください。CException オブジェクトがグローバル オブジェクトであったり、スタック上に作成されていることがあるからです。 とあるので、deleteで削除せず、pException->Delete()とするべきです。
- redfox63
- ベストアンサー率71% (1325/1856)
コンパイラのチェックが厳しくなったので顕在化したのでしょう VC6でも CExceptionクラスを直接生成すべきでない旨の記述がMSDNにありますよ MSDN CExceptionのコンストラクタより引用 このメンバ関数は CException オブジェクトを構築します。CException オブジェクトを new で直接作成しないでください。CException からクラスを派生したときはこのコンストラクタを使用してください。
補足
ありがとうございます。 やっぱり単純にコンパイラのチェックが厳しくなったと 思えばいいんでしょうかね。 となると、CException を基底クラスとしたものを作ってやって、 その中でオーバーライドしないと駄目でしょうか? それとも、CMemoryException等 を使って CMemoryException* pException = new CMemoryException; としても問題ないものなのでしょうか? 単純な環境変化による移植なので、余り手を加えたくは 無いものですから。 ちなみに、引用されている文ですが、 「newで直接作成しないでください。」 ってのはどの辺に書かれてますか?
- hidebun
- ベストアンサー率50% (92/181)
> それならなぜVC++6.0の時には出なかったのでしょうか? VC++6.0の時代は、CExceptionが抽象クラスじゃなかったのでしょうね。
補足
ありがとうございます。 そう思って afx.h を見てみたのですが、VC++6.0、VC++2005とも virtual となっていました。
補足
おっとぉ、見逃していました。 ありがとうございます。違いが見つかってちょっとすっきりです。 よく比べもせずでどうも申し訳ありませんでした。