1 maja 2013

Delegating constructors

Delegating constructors używają innych konstruktorów z klasy do wykonania inicjalizacji, dzięki temu nie trzeba już korzystać z metod pomocniczych, by uwspólnić powtarzające się części kodu.
#include <iostream>

class Value {
public:
    Value(int i) {
        std::cout << "Value " << i << std::endl;
    }
};

class MyClass {
public:
    MyClass() : MyClass(4) {
        std::cout << "Constructor 1" << std::endl;
    }
    MyClass(int v) : MyClass("MyClass", v, 5) {
        std::cout << "Constructor 2" << std::endl;
        value3 = Value(77);
    }
    MyClass(std::string s, int v1, int v2) : value1(v1), value2(v2), value3(66) {
        std::cout << "Constructor 3" << std::endl;
        value3 = Value(88);
    }
private:
    Value value1;
    Value value2;
    Value value3;
};

int main()
{
    MyClass m;
    return 0;
}
Wyniki:
Value 4
Value 5
Value 66
Constructor 3
Value 88
Constructor 2
Value 77
Constructor 1
Wygląda na to, że na liście konstruktora, który oddelegowuje swoje działanie może się pojawić tylko i wyłącznie inny konstruktor (żadne zmienne) - wywnioskowane na podstawie informacja z clang-a.
$ clang++ main.cpp -std=c++11
main.cpp:12:17: error: an initializer for a delegating constructor must appear alone
    MyClass() : value3(11), MyClass("MyClass", 4, 5) {
                ^~~~~~~~~~
1 error generated.

Brak komentarzy:

Prześlij komentarz