c ++调用带有计算参数的超类构造函数

时间:2012-03-02 19:56:04

标签: c++ inheritance constructor

可能它非常容易,但有人可以告诉我如何使用子类'构造函数中计算的参数调用超类'构造函数?像这样的东西:

class A{
  A(int i, int j);
};

class B : A{
  B(int i);
};

B::B(int i){
  int complex_calculation_a= i*5;
  int complex_calculation_b= i+complex_calculation_a;
  A(complex_calculation_a, complex_calculation_b);
}

//编辑:我编辑了这个例子,以便超类采用两个彼此有关系的参数

5 个答案:

答案 0 :(得分:5)

如果无法在单行表达式中表达计算,请添加一个静态函数,并按照通常调用超类构造函数的方式调用它:

class B : A{
public:
    B(int i) : A(calc(i)) {};
private:
    static int calc(int i) {
        int res = 1;
        while (i) {
            res *= i--;
        }
        return res;
    }
};

编辑多参数案例:

class B : A{
public:
    B(int i) : A(calc_a(i), calc_b(i)) {};
private:
    static int calc_a(int i) {
        int res = 1;
        while (i) {
            res *= i--;
        }
        return res;
    }
    static int calc_b(int i) {
        int complex_a = calc_a(i);
        return complex_a+10;
    }
};

答案 1 :(得分:3)

B::B(int i) 
    : A(i * 5) 
{}

使用C ++ 11,更复杂的方法是

B::B(int i)
    : A(([](int x) { return 5 * x; })(i))
{}

对于复杂的情况,受保护的init函数更具可读性。

答案 2 :(得分:1)

只有这样:

class A{
  A(int i);
};

class B : A{
  B(int i);
};

B::B(int i) : A(i*5) {
}

对父级构造函数的调用只能出现在初始化列表中。这意味着,无论你计算什么,必须在完全构造B之前知道(即:你不能调用B成员函数,除非它static,但是只依赖于传递给B)的参数

答案 3 :(得分:1)

struct A
{
    A(int);
};

struct B : public A
{
    B()
        : A(5) // "initialisation list"
    {}
};

您必须在列表中执行此操作,但您可以使用某个功能。 编辑:如果您使用某个函数,您可能希望将其作为B的私有静态成员。

答案 4 :(得分:0)

class A
{
public:
   A(int i){}
};


class B : public A
{
public:
    B(int i):A(i*5){}
};