2016-10-24 2 views
1
class Base { 
public: 
    Base(int a, int b); 
}; 

class Derived : public Base { 
private: 
    static std::pair<int, int> determine_a_and_b_(int k); 
public: 
    explicit Derived(int k); 
}; 

Derived::Derived(int k) : 
    // a, b from determine_a_and_b_(k)... 
    Base(a, b) { } 

Есть ли способ вызова determine_a_and_b_ в конструкторе Derived класса, чтобы получить значения a и b, перед вызовом Base::Base?Выполнение кода перед вызовом конструктора базового

Похоже, что единственный способ был бы реорганизовать Base так, что он может быть сначала по умолчанию, возведенный в нулевой объект, а затем инициализируются a и b позже, как

Derived::Derived(int k) : Base() { 
    Base::init_(a, b); 
} 

Есть ли лучший способ сделать это, без необходимости менять Base?

Редактировать - сделали determine_a_and_b_ статическую

ответ

3

Что вы можете сделать здесь написать функцию, которая возвращает Base и в функции создания базы из std::pair возвращенного determine_a_and_b_. Это позволяет условно инициализировать базу в списке инициализации члена. У вас было бы что-то вроде

class Base { 
public: 
    Base(int a, int b); 
}; 

class Derived : public Base { 
private: 
    static std::pair<int, int> determine_a_and_b_(int k); 
    static Base create_base(const std::pair<int, int>& params) { return Base(params.first, params.second); } 
public: 
    explicit Derived(int k); 
}; 

Derived::Derived(int k) : Base(create_base(determine_a_and_b_(k)) {} 
+1

Не будет '' determine_a_and_b_' и create_base' должны быть 'static', чтобы избежать зависимости от неинициализированный объект? – melpomene

+0

@melpomene хороший звонок. Обновлен ответ. – NathanOliver

2

Вызов функций-членов перед тем, как ваш конструктор даже начинает работать, всегда затенен. В конечном итоге вы запускаете код объекта, который еще не создан.

Один из вариантов заключается в получении второго основания. Это базовый класс inited первого, выбирает и Ь, и затем использовать их для инициализации вашего второго базового класса:

class Base { 
public: 
    Base(int a, int b){}; 
}; 

class Params 
{ 
protected: 
    Params() 
    { 
    // this replaces std::pair<int, int> determine_a_and_b_(int k); 
    // put your logic here 
     _values.first = 0; 
     _values.second = 1; 
    } 
    std::pair<int, int> _values; 
}; 

class Derived : public Params, public Base { 
private: 
public: 
    explicit Derived(int k); 
}; 

Derived::Derived(int k) : 
    Base(_values.first, _values.second) 
{ 

} 
+0

Приятно, но это постоянно объявляет 'Derived' на 2' int '. Каждый объект хранит 'a' и' b' навсегда. – melpomene

Смежные вопросы