Вызывающий конструктор члена класса в конструкторе

Можно ли вызвать конструктор элемента в моем конструкторе класса?

let say Если у меня есть член bar класса type foo в моем классе MClass. Можно ли вызвать конструктор bar в конструкторе MClass? Если нет, то как я могу инициализировать свою панель элементов?

Это проблема инициализации членов в составе (агрегация).

14
14 окт. '11 в 2:42
источник поделиться
5 ответов

Да, конечно, вы можете! Это то, для чего предназначен список инициализаторов конструктора. Это важная функция, требующая инициализации членов, у которых нет конструкторов по умолчанию, а также констант и ссылок:

class Foo
{
  Bar x;     // requires Bar::Bar(char) constructor
  const int n;
  double & q;
public:
  Foo(double & a, char b) : x(b), n(42), q(a) { }
  //                      ^^^^^^^^^^^^^^^^^^^
};

Вам также понадобится список инициализаторов, чтобы указать конструктор нестандартных классов для базовых классов в конструкторах производного класса.

26
14 окт. '11 в 2:48
источник

Да, вы можете:

#include <iostream>

using std::cout;
using std::endl;

class A{
public:
    A(){
        cout << "parameterless" << endl;
    }

    A(const char *str){
        cout << "Parameter is " << str <<endl;
    }
};

class B{
    A _argless;
    A _withArg;

public:
    // note that you need not call argument-less constructor explicitly.
    B(): _withArg("42"){
    }
};

int main(){
    B b;

    return 0;
}

Вывод:

parameterless
Parameter is 42

Посмотрите это на ideone.com

6
14 окт. '11 в 2:51
источник

Через список инициализаторов, если базовый класс не имеет конструктора по умолчанию.

struct foo{
   foo( int num )
   {}
};

struct bar : foo {
   bar( int x ) : foo(x)
               // ^^^^^^ initializer list
   {}
};
3
14 окт. '11 в 2:47
источник

Вот так:

class C {
  int m;

public:

  C(int i):
    m(i + 1) {}

};

Если ваш конструктор-член хочет параметры, вы можете передать их. Они могут быть выражениями из параметров конструктора классов и уже инициализированными типами.

Помните: члены инициализируются в том порядке, в котором они объявлены в классе, а не в порядке их появления в списке инициализации.

3
14 окт. '11 в 2:45
источник

Да, вы можете. Это делается в списке инициализации вашего класса. Например:

class MClass 
{

  foo bar;

public:

  MClass(): bar(bar_constructor_arguments) {};
}

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

2
14 окт. '11 в 2:46
источник

Посмотрите другие вопросы по меткам или Задайте вопрос