在调用基类构造函数之前修改构造函数参数值

mar*_*inj 4 c++

我有以下类层次结构:

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) {}
};
Run Code Online (Sandbox Code Playgroud)

类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; }
Run Code Online (Sandbox Code Playgroud)

但它不允许我设置正确的值,以防abc值依赖于上面的基类c-tor示例.

我想把它扩展到:

   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; }
Run Code Online (Sandbox Code Playgroud)

我想还应该有某种标志表明修复已经完成.我不确定这是否真的是正确的c ++.

我知道最好的解决方案是实际捕获异常.

eca*_*mur 8

考虑在Derived和之间插入一个类Base:

class Derived: public UnpackToBase {
public:
    Derived(int a, int b, int c): UnpackToBase(FixParameters(a, b, c))

class UnpackToBase: public Base {
public:
    UnpackToBase(FixParameters params): Base(params.a, params.b, params.c)

struct FixParameters {
    int a, b, c;
    FixParameters(int a, int b, int c): a(a), b(b), c(c) {
         // do stuff
    }
Run Code Online (Sandbox Code Playgroud)

在C++ 11可以使用委托构造函数Derived:

class Derived: public Base {
public:
    Derived(int a, int b, int c): Derived(FixParameters(a, b, c)) { }
    Derived(FixParameters params): Base(params.a, params.b, params.c) { }
Run Code Online (Sandbox Code Playgroud)