конструктор суперкласса вызова c ++ с вычисленными аргументами - PullRequest
6 голосов
/ 02 марта 2012

Возможно, это очень просто, но может кто-нибудь сказать мне, как я могу вызвать конструктор суперкласса с аргументами, вычисленными в конструкторе подкласса? как то так:

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);
}

// edit: я отредактировал пример так, что суперкласс принимает два аргумента, которые имеют отношение друг к другу

Ответы [ 5 ]

5 голосов
/ 02 марта 2012

Если вы не можете выразить свои вычисления в однострочном выражении, добавьте статическую функцию и вызовите ее так, как вы обычно вызываете конструктор суперкласса:

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;
    }
};

EDIT Случай с несколькими аргументами:

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;
    }
};
3 голосов
/ 02 марта 2012
B::B(int i) 
    : A(i * 5) 
{}

В C ++ 11 более сложный способ -

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

. В сложных случаях защищенная функция init более читабельна.

1 голос
/ 02 марта 2012
struct A
{
    A(int);
};

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

Вы должны сделать это внутри списка, но вы можете использовать функцию.Изменить: Если вы используете функцию, вы, вероятно, хотите сделать ее частным статическим членом B.

1 голос
/ 02 марта 2012

Только так:

class A{
  A(int i);
};

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

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

Вызов конструктору родителя возможен только в списке инициализации. Это означает, что все, что вы вычисляете, должно быть известно до того, как B будет полностью построено (то есть: вы не можете вызвать B функцию-член, если только она не static, а только полагаться на параметры переданы B)

0 голосов
/ 03 марта 2012
class A
{
public:
   A(int i){}
};


class B : public A
{
public:
    B(int i):A(i*5){}
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...