2012-03-02 2 views
5

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

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

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

ответ

4

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

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

okay - и если конструктор суперкласса принимает несколько аргументов? – Mat

+0

@Mat Вам нужно будет определить отдельную функцию для вычисления значения каждого параметра, который вы не можете или не хотите «встроить» в качестве выражения. – dasblinkenlight

+0

, но рассчитанные аргументы могут зависеть друг от друга - как я могу решить это с помощью различных функций? – Mat

1

Только так:

class A{ 
    A(int i); 
}; 

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

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

ВЫЗОВ МАСТЕРА к конструктору родителя может войти только в список инициализации. Это означает, что все, что вы вычисления должны быть известны до того B полностью построен (т.е. вы не можете вызвать функцию с B члена, если его static, но только полагаться на параметры, передаваемые B)

+0

хорошо - в этом случае мой пример был плох. Мне нужно сделать несколько вызовов функций, циклов, условного разветвления и т. Д., Чтобы вычислить аргументы – Mat

+0

@Mat - как я уже сказал, вы можете делать это только во внешней функции (либо глобальном, либо статическом члене класса, либо функции-члене объект передан в 'B'). 'B' не существует, когда вызывается' A'. – littleadv

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

С C++ 11, более сложный путь

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

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

1
struct A 
{ 
    A(int); 
}; 

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

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

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


class B : public A 
{ 
public: 
    B(int i):A(i*5){} 
}; 
Смежные вопросы