可能它非常容易,但有人可以告诉我如何使用子类'构造函数中计算的参数调用超类'构造函数?像这样的东西:
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);
}
//编辑:我编辑了这个例子,以便超类采用两个彼此有关系的参数
答案 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){}
};