2015-05-23 2 views
-1

Мне нужно использовать параметры по умолчанию для конструктора наследуемого класса.Параметры конструктора по умолчанию в классе наследования

class A 
{ 
public: 
    A(int data) 
    { 
     a_data = data; 
    } 
    ~A(){} 

    int a_data; 
}; 


class B : public A 
{ 
public: 
    B(int in, int num = DATA) : A(num) 
    { 
     b_data = in; 
    } 
    const int DATA = 9; 
    int b_data; 
}; 

int main() 
{ 
    B b(3); 
    int x = b.a_data; 

    return 0; 
} 

Я нашел here, что я могу использовать параметры по умолчанию для конструктора класса ребенка. Но говорят, что мы должны использовать глобальный параметр.

Но я использую данные из класса «B», поэтому вызывается конструктор A до освобождения этих данных. В результате я получаю мусор в «х», но не 9.

! Итак, проблема была извлечена из другой, более конкретной. У меня есть базовый класс «Объект». И некоторым детям нравится «Моб» или «Игрок». Объект имеет физический (Box2D) объект внутри. Сертифицированно, все действия, создающие это физическое тело, одинаковы, за исключением некоторых параметров. Итак, я храню алгоритм в «Object» construtor и помещаю все необходимые данные в дочерние классы. Но я не могу достичь этих данных, прежде чем создавать «Объект», который требует данных.

Here является примером решения для одного зависимого класса.

Буду признателен за любую помощь.

+0

Может кто-нибудь объяснить, почему версия выше все еще компилируется, но не производит 9? Компилятор просто игнорирует 'cost int num = 9' при построении A? – rivanov

+0

@rivanov компилятор сначала создает базовую часть производного объекта и только после того, как он инициализирует другие члены объекта Derived. Когда он пытается построить базу, члены объекта Derived еще не инициализированы. – vsoftco

+0

@vsoftco А я вижу, так что вы говорите, когда вызывается 'B (int in): A (num)', это выполняется до 'const int num = 9', который по умолчанию равен 0. Таким образом, 'A (num)' всегда вызывается с 0. Является ли это правильной интерпретацией? – rivanov

ответ

1

Используйте конструктор по умолчанию значения, такие как:

B(int in, int num = 9) : A(num) { 
    b_data = in; 
} 

Это работает, как показано here.

+0

Даже лучше, чем мой подход, рекомендуется! – vsoftco

+0

Я уже пробовал этот вариант, но получаю сообщение об ошибке: «нестатический член должен относиться к определенному объекту» – Entrack

+0

@vsoftco: Спасибо за ваш комментарий; означает что-то от пользователя> 10k, такого как вы. –

0

Что вы хотите, чтобы обеспечить конструктор по умолчанию для A

A(int data = 9) 

так B может создать по умолчанию A S, которые имеют 9 в качестве своего параметра,

B(int in){...} // here the A part is constructed with 9 

Ваш фактический код не сделайте то, что вы ожидаете, поскольку конструктор B сначала пытается построить базовую часть (в данном случае A) и только после инициализации остальной части B.

+0

В принципе, нет. Мне нужно 2 параметра для создания B. «in» и «num» - по умолчанию – Entrack

+0

@Entrack См. Обновленное редактирование.В противном случае вам понадобится глобальная переменная, которая не подходит. – vsoftco

+0

Видите ли, если у меня больше дочерних классов с индивидуальными параметрами, было бы неверно – Entrack

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