私のcsクラスの私の割り当ては、std :: logic_errorから継承した2つのカスタム例外クラスを作成することです:OverflowingSwimmingPoolExceptionとUnderflowingSwimmingPoolException。不正な操作が試行されると、エラーメッセージを出力するのではなく、カスタム例外を作成してスローします。 try ... catchブロックをドライバコードに含めて、例外をキャッチします。は、std :: logic_errorから継承する2つのカスタム例外クラスを作成できません。
これは私のヘッダファイルの一部です:用 コンストラクタ「CS52 :: UnderflowingSwimmingPoolExceptionは、」明示的に基底クラスのSTDを初期化する必要があります。ここに
#ifndef SWIMMINGPOOL_H
#define SWIMMINGPOOL_H
#include <stdexcept>
#include <iostream>
using namespace std;
namespace cs52
{
class OverflowingSwimmingPoolException: public logic_error
{
OverflowingSwimmingPoolException(){};
};
class UnderflowingSwimmingPoolException: public logic_error
{
UnderflowingSwimmingPoolException(){};
};
コンパイラは、コンストラクタがある行に言うされています。 :logic_error 'にはデフォルトのコンストラクタがありません。
私は私の実装ファイルに持っているものです。
#include "SwimmingPool.h"
#include <stdexcept>
#include <iostream>
using namespace std;
namespace cs52
{
SwimmingPool operator +(const SwimmingPool& pool1, const SwimmingPool& pool2) throw (OverflowingSwimmingPoolException, UnderflowingSwimmingPoolException)
{
SwimmingPool temp;
temp.mySize = pool1.mySize+pool2.mySize;
temp.myContents = pool1.myContents+pool2.myContents;
if (temp.myContents>temp.mySize)
throw OverflowingSwimmingPoolException();
return temp;
}
SwimmingPool operator -(const SwimmingPool& pool1, const SwimmingPool& pool2) throw (OverflowingSwimmingPoolException, UnderflowingSwimmingPoolException)
{
SwimmingPool temp;
temp.mySize= pool1.mySize-pool2.mySize;
temp.myContents= pool1.myContents-pool2.myContents;
if (temp.myContents>temp.mySize)
throw OverflowingSwimmingPoolException();
if (temp.myContents<0 || temp.mySize<0)
throw UnderflowingSwimmingPoolException();
return temp;
}
}
コンパイラが、私は例外クラスをスローラインにエラーが表示されます。クラスcs53:OverflowingSwimmimgPoolExceptionのプライベートコンストラクタを呼び出します。
と私のドライバファイルの一部は、そのようなことになります。using namespace cs52;
try {
SwimmingPool badPool = smallOne - bigOne;
cout << "This should never happen..." << endl;
}
catch(UnderflowingSwimmingPoolException uspe) {
cout << "working..." << endl;
}
catch(OverflowingSwimmingPoolException uspe) {
cout << "This should never happen..." << endl;
}
私はコードに開始しているので、私は本当に理解していないがどのようにすでに作成されているのstd :: logic_errorのようなクラスライブラリは機能します。派生例外のコンストラクタで
ありがとう!それは助けになった! – Marina
今私は別の問題があります。何らかの理由で、tryブロック内のメンバ関数を使用しても、オブジェクトの変数は変更されません。私がtryブロックから同じメンバ関数を使用すると、それは完全に正常に動作します!あなたは何が間違っているか考えていますか? – Marina
@マリナどのコードも見ることができないと、問題が何であるかを言うことができません。新しい問題はこの問題とは無関係であるため、別の質問として投稿してください。もちろん、[最小限で完全で検証可能な例](http://stackoverflow.com/help/mcve)も含まれています。また、問題が解決された回答(最小または他の誰かから)があると感じる場合は、回答の横にあるチェックマークをクリックして「受け入れ済み」とマークする必要があります。 –