質問 |
||
| 質問者:happy10429 | 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の時には出なかったのでしょうか? 以上、よろしくお願い致します。 |
|
質問投稿日時:08/04/30 17:13 質問番号:3987720 |
||
回答 |
|
| 回答者:redfox63 | > 「newで直接作成しないでください。」 は 2001/10版のMSDNのドキュメントに記載されています WEB版の方には記載はないようです |
|---|---|
| 種類:アドバイス どんな人:専門家 自信:参考意見 |
|
| |
回答日時:08/05/01 14:15 回答番号:No.5 |
|
| 参考URL: | http://msdn.microsoft.com/ja-jp/library/6eyf1ccs.aspx |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答良回答20pt |
|
| 回答者:hidebun | > そう思って afx.h を見てみたのですが、VC++6.0、VC++2005とも > virtual となっていました。 VC++2005のほうは、デストラクタが純粋仮想関数になっていませんか? (=0がついていませんでしたか?) |
|---|---|
| 種類:補足要求 どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/05/01 09:05 回答番号:No.4 |
|
| この回答への補足 | おっとぉ、見逃していました。 ありがとうございます。違いが見つかってちょっとすっきりです。 よく比べもせずでどうも申し訳ありませんでした。 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| 回答者:hidebun | あ、それから、オブジェクトを削除方法について。 http://msdn.microsoft.com/ja-jp/library/97z4sxfb.aspx CException オブジェクトを削除するときは、Delete メンバ関数で例外を削除します。delete 演算子を直接呼び出さないでください。CException オブジェクトがグローバル オブジェクトであったり、スタック上に作成されていることがあるからです。 とあるので、deleteで削除せず、pException->Delete()とするべきです。 |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/04/30 18:19 回答番号:No.3 |
|
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答良回答10pt |
|
| 回答者:redfox63 | コンパイラのチェックが厳しくなったので顕在化したのでしょう VC6でも CExceptionクラスを直接生成すべきでない旨の記述がMSDNにありますよ MSDN CExceptionのコンストラクタより引用 このメンバ関数は CException オブジェクトを構築します。CException オブジェクトを new で直接作成しないでください。CException からクラスを派生したときはこのコンストラクタを使用してください。 |
|---|---|
| 種類:回答 どんな人:専門家 自信:参考意見 |
|
| |
回答日時:08/04/30 18:16 回答番号:No.2 |
|
| この回答への補足 | ありがとうございます。 やっぱり単純にコンパイラのチェックが厳しくなったと 思えばいいんでしょうかね。 となると、CException を基底クラスとしたものを作ってやって、 その中でオーバーライドしないと駄目でしょうか? それとも、CMemoryException等 を使って CMemoryException* pException = new CMemoryException; としても問題ないものなのでしょうか? 単純な環境変化による移植なので、余り手を加えたくは 無いものですから。 ちなみに、引用されている文ですが、 「newで直接作成しないでください。」 ってのはどの辺に書かれてますか? |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| 回答者:hidebun | > それならなぜVC++6.0の時には出なかったのでしょうか? VC++6.0の時代は、CExceptionが抽象クラスじゃなかったのでしょうね。 |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/04/30 17:52 回答番号:No.1 |
|
| この回答への補足 | ありがとうございます。 そう思って afx.h を見てみたのですが、VC++6.0、VC++2005とも virtual となっていました。 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |