1

runtime_errorc'torから派生し、int を取得する独自の例外クラスを作成しました。

ポリモーフィズムを使用するために、この例外の基本クラスを作成したいので、基本クラスのみをキャッチでき、基本的には派生クラスをキャッチします。

したがって、これは基本クラスです: (そして、別の cpp ファイルで baseException::~baseException(){} を取得しました)

class baseException
{
    virtual ~baseException()=0 {}
};

そして、これは派生クラスです:

class myException: public runtime_error, public baseException
{
public:
    myException(int): runtime_error("Error occured") {}
};

基本クラスに実際のエラーはないことに注意してください。唯一の役割は、作成する将来のカスタム例外クラスでポリモーフィズムを有効にすることです。そのため、純粋な仮想 d'tor しかありません。BaseExceptionこのクラスの「実際の」オブジェクトは必要ありません。

ただし、メインで baseException をキャッチして what() を呼び出そうとすると、できません。どうすれば機能しますか?

4

3 に答える 3

4

最初の問題は()、デストラクタの宣言に the がないことと:、クラス名の後に rogue があることです。

それを修正すると、おそらく次のようなエラーが表示されます。

error: pure-specifier on function-definition

C++ 標準委員会だけが知っている何らかの理由で、純粋仮想関数はそのようなクラス定義内で実装できません。純粋な仮想にしたい場合は、定義をクラスの外に移動する必要があります。

class baseException
{
    virtual ~baseException()=0;
};

inline baseException::~baseException() {}

また、 がormyExceptionから派生するかどうかを決定する必要があります。1 つはクラス ヘッダーで使用し、もう 1 つはコンストラクターの初期化子リストで使用します。標準の例外タイプを使用していると仮定すると、おそらくそうなるはずです(そして、ヘッダー ファイルに がある場合は、それを削除して、グローバル名前空間がそのように汚染されることを予期しないコードを壊さないようにする必要があります)。runtime_exceptionruntime_errorstd::runtime_errorusing namespace std;

于 2012-06-18T12:21:53.100 に答える
1

既に述べたように、デストラクタには括弧と非インライン定義が必要です。

runtime_exceptionまた、 (AMP ライブラリから?) から派生しますが、(私が想定する名前空間runtime_errorから) のコンストラクターを呼び出します。std

于 2012-06-18T12:21:35.630 に答える
0

かっこを忘れました。そのはず

virtual ~baseException()=0 {}
于 2012-06-18T12:16:49.147 に答える