2011-10-13 17 views
15

Czy mogę wywołać konstruktora członka w moim konstruktorze klasy?Wywołanie konstruktora członka klasy w konstruktorze

Powiedzmy, że jeśli mam członka bar klasy typu foo w mojej klasie MClass. Czy mogę wywołać konstruktora paska w konstruktorze MClass? Jeśli nie, to w jaki sposób mogę zainicjować mój pasek członkowski?

Jest to problem inicjowania członków w kompozycji (agregacji).

Odpowiedz

26

Tak, na pewno możesz! Do tego służy lista inicjatorów konstruktora :. Jest to istotna cecha, które wymagają, aby zainicjować członków, które nie mają domyślnych konstruktorów, a także stałe i referencje:

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

możliwość dalszej potrzeby listę initializer określić inny niż domyślny konstruktor klasy bazowej w konstruktory klas pochodnych.

3

Jak to:

class C { 
    int m; 

public: 

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

}; 

Jeśli konstruktor członek chce parametry, można przekazać je. Mogą to być wyrażenia wykonane z parametrów konstruktora klasy i już zainicjowanych typów.

Zapamiętaj: członkowie są inicjowani w kolejności, w jakiej są zadeklarowani w klasie, a nie w kolejności, w jakiej pojawiają się na liście inicjalizacyjnej.

2

Tak, możesz. Odbywa się to na liście inicjującej twojej klasy. Np.

class MClass 
{ 

    foo bar; 

public: 

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

ta wybuduje bar z argumentów przekazanych normalnie argumenty będą inni członkowie klasy lub argumentów, które zostały przekazane do konstruktora. Ta składnia jest wymagana dla wszystkich elementów, które nie mają konstruktów bezargumentowych.

3

Poprzez listę inicjalizującą, jeśli klasa bazowa nie ma domyślnego konstruktora .

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

struct bar : foo { 
    bar(int x) : foo(x) 
       // ^^^^^^ initializer list 
    {} 
}; 
6

Tak, można:

#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; 
} 

Wyjście jest:

parameterless 
Parameter is 42 

View this on ideone.com

+0

Twój komentarz na temat argumentów mniej konstruktorzy członkowskie nie trzeba nazwać wprost jest dokładnie to, co ja szukam. Dzięki! – Jaime

Powiązane problemy