класс c ++ в конструкторе класса по умолчанию

Меня беспокоит конструктор по умолчанию и его список инициализации. В простом случае это понятно, например:

class A
{
protected:
double d1;
//classB obj1; //how to initialize this one in a default constructor?
public:
A (double x = 0.0): d1(x){} //constructor
virtual ~A(void) {};
//something
}

Но как инициализировать объект класса B, который имеет большое количество членов? Или как вообще инициализировать в конструкторе по умолчанию некоторый тип, который имеет большое или неизвестное количество параметров для инициализации?

1

Решение

Вы можете инициализировать obj1 в member initializer list вызывая его конструктор по умолчанию или другие конструкторы

class A
{
protected:
double d1;
classB obj1;
pthread_mutex_t m_mutex;
public:
A (double x = 0.0): d1(x), obj1(), m_mutex(PTHREAD_MUTEX_INITIALIZER) {}
virtual ~A(void) {}
//something
}

если у classB большие члены, как вы описали, вы можете нарушить правило дизайна класса — one class does one thing, Возможно, вы захотите разбить classB на маленькие независимые классы.

1

Другие решения

Если вы хотите явно инициализировать объект, просто добавьте его в список инициализатора конструктора:

struct Foo
{
Foo(int arg) { ... }
};

struct Bar
{
Foo foo;

Bar()
: foo(123)  // Initialize `foo` with an argument
{ ... }
};
1

Если элемент может быть инициализирован его конструктором по умолчанию, то он даже не должен быть в списке инициализации, потому что конструктор по умолчанию не имеет параметров. Будет вызван конструктор по умолчанию. Примитивы не имеют конструкторов по умолчанию, поэтому они должны быть в списке инициализации, если вы хотите, чтобы они были инициализированы.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector