вызывающий конструктор члена класса в конструкторе - PullRequest
23 голосов
/ 14 октября 2011

Могу ли я вызвать конструктор члена в конструкторе моего класса?

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

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

Ответы [ 5 ]

35 голосов
/ 14 октября 2011

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

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) { }
  //                      ^^^^^^^^^^^^^^^^^^^
};

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

6 голосов
/ 14 октября 2011

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

#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

3 голосов
/ 14 октября 2011

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

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

struct bar : foo {
   bar( int x ) : foo(x)
               // ^^^^^^ initializer list
   {}
};
3 голосов
/ 14 октября 2011

Вот так:

class C {
  int m;

public:

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

};

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

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

2 голосов
/ 14 октября 2011

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

class MClass 
{

  foo bar;

public:

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

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

...