0

C++

独自のメンバー関数を使用して構築を防ぐことによりthrow、コンストラクターの本体の開き中括弧の前にクラスを例外にしたいと考えています。任意に選択された戻り値のない型と、その戻り値の型に一致する型を持つダミー データ メンバーを使用して、無条件に例外を発生{させることだけを目的とするメンバー関数を定義しました。コンストラクター初期化子リストの上記のメンバー関数。これは機能しますが、非おもちゃのクラスでは、ダミー変数はメンバー関数を実行するための言い訳をする以外の目的を果たさず、メンバー関数の非throwvoidthrowvoid戻り値の型は、同じ型のダミー データ メンバーのコンストラクターによって呼び出し可能になるための言い訳をする以外の目的はありません。

このおもちゃはコンパイルできますが、エレガントではありません:

class Toy
{
public:
    Toy() : dummy(preventer()) {}
private:
    int dummy;
    int preventer() {throw -1; return 0;}
};

#include <iostream>

int main()
{
    try
    {
        Toy t;
    }
    catch (const int& e)
    {
        std::cout << "caught the exception\n";
    }
    return 0;
}

コンソール出力:

caught the exception

{ダミー変数がなければ、コンストラクタ本体の開き中括弧の前に例外をスローする方法はありますか?

4

2 に答える 2

2

はい、データ メンバーの代わりに基本クラスを使用して、基本クラスのコンストラクターを呼び出すことができます。

古いバージョンの GNU デバッガーgdb(数年前) は、このような例外でブレークできなかったことに注意してください。

ただし、Visual C++ では問題なく動作し、最新バージョンの GNU ツールチェーンでも使用できると思います。

于 2013-03-28T02:30:19.617 に答える
1

次のように、関数のダミーの戻り値を回避できます。

bool called = (function(), true);

右側の 2 つの式の間にあるコンマ演算子は、式を順番に評価し、最後の結果以外はすべて破棄します。私が疑問に思っているのは、なぜあなたが最初の中括弧の前にそれをすることを主張するのかということです. 体の最初のものとして関数を呼び出すことでは達成できないことを、ここで正確に何を達成しようとしていますか?

できるだけ早く中止したい場合は、別の基底クラスでそれを行うことがおそらく最善の解決策であることに注意してください (そこでプライベート継承を使用できます)。これは、他の基地の建設さえ防ぐことができる唯一の解決策ですが、あなたの解決策ではできません。

于 2013-03-28T05:46:59.427 に答える