プロが教えるわが家の防犯対策術!

こんにちわ、お世話になります。

現在、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の時には出なかったのでしょうか?

以上、よろしくお願い致します。

A 回答 (5件)

> 「newで直接作成しないでください。


は 2001/10版のMSDNのドキュメントに記載されています
WEB版の方には記載はないようです

参考URL:http://msdn.microsoft.com/ja-jp/library/6eyf1ccs …
    • good
    • 0

> そう思って afx.h を見てみたのですが、VC++6.0、VC++2005とも


> virtual となっていました。

VC++2005のほうは、デストラクタが純粋仮想関数になっていませんか?
(=0がついていませんでしたか?)

この回答への補足

おっとぉ、見逃していました。

ありがとうございます。違いが見つかってちょっとすっきりです。
よく比べもせずでどうも申し訳ありませんでした。

補足日時:2008/05/01 09:20
    • good
    • 0

あ、それから、オブジェクトを削除方法について。



http://msdn.microsoft.com/ja-jp/library/97z4sxfb …
CException オブジェクトを削除するときは、Delete メンバ関数で例外を削除します。delete 演算子を直接呼び出さないでください。CException オブジェクトがグローバル オブジェクトであったり、スタック上に作成されていることがあるからです。

とあるので、deleteで削除せず、pException->Delete()とするべきです。
    • good
    • 0

コンパイラのチェックが厳しくなったので顕在化したのでしょう



VC6でも CExceptionクラスを直接生成すべきでない旨の記述がMSDNにありますよ

MSDN CExceptionのコンストラクタより引用

このメンバ関数は CException オブジェクトを構築します。CException オブジェクトを new で直接作成しないでください。CException からクラスを派生したときはこのコンストラクタを使用してください。

この回答への補足

ありがとうございます。

やっぱり単純にコンパイラのチェックが厳しくなったと
思えばいいんでしょうかね。

となると、CException を基底クラスとしたものを作ってやって、
その中でオーバーライドしないと駄目でしょうか?

それとも、CMemoryException等 を使って
CMemoryException* pException = new CMemoryException;
としても問題ないものなのでしょうか?

単純な環境変化による移植なので、余り手を加えたくは
無いものですから。

ちなみに、引用されている文ですが、
「newで直接作成しないでください。」
ってのはどの辺に書かれてますか?

補足日時:2008/05/01 08:48
    • good
    • 0

> それならなぜVC++6.0の時には出なかったのでしょうか?



VC++6.0の時代は、CExceptionが抽象クラスじゃなかったのでしょうね。

この回答への補足

ありがとうございます。

そう思って afx.h を見てみたのですが、VC++6.0、VC++2005とも
virtual となっていました。

補足日時:2008/05/01 08:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!