次のクラス階層があります。
class Base { // This class cannot be modified
public:
Base(int a, int b, int c) {
if ( a == 100 && b == 200 && c < 100 ) // whatever condition
throw "Error!";
}
};
class Derived : public Base { // this class can be modified
public:
Derived(int a, int b, int c) : Base(a, b, c) {}
};
class Derived はコードの多くの場所で使用されるため、ある種のファクトリ関数に置き換えることはできません。
問題は、Base コンストラクターを呼び出す前に a、b、c の値を修正できるコンストラクトがあるかどうかです。
次のような関数を使用できることを知っています。
Derived(int a, int b, int c) : Base(FixA(a), FixB(b), FixC(c)) {}
int FixA(int a) { /*fix a value*/ return a; }
int FixB(int b) { /*fix b value*/ return b; }
int FixC(int c) { /*fix c value*/ return c; }
ただし、上記の基本クラスの c-tor の例のように abc 値が依存している場合、正しい値を設定することはできません。
これを次のように拡張することを考えていました:
Derived(int a, int b, int c) : Base(FixA(a,b,c), FixB(a,b,c), FixC(a,b,c)) {}
int FixA(int a, int& b, int& c) { /*fix a b c values*/ return a; }
int FixB(int& a, int b, int& c) { /*fix a b c values*/ return b; }
int FixC(int& a, int& b, int c) { /*fix a b c values*/ return c; }
修正が既に行われたことを示す何らかのフラグもあるはずです。これが実際に正しい c++ であるかどうかはわかりません。
最善の解決策は、実際に例外をキャッチすることです。