2013-01-06 21 views
5

mam tej klasyC++ wywołanie konstruktora inny konstruktor na podstawie parametru typu

class XXX { 
    public: 
     XXX(struct yyy); 
     XXX(std::string); 
    private: 
     struct xxx data; 
}; 

Pierwszy konstruktor (który pracuje ze strukturą) jest łatwe do wdrożenia. Drugi mogę podzielić jeden ciąg w określonym formacie, parsować i mogę wydobyć tę samą strukturę.

Moje pytanie brzmi, w java można zrobić coś takiego:

XXX::XXX(std::string str) { 

    struct yyy data; 
    // do stuff with string and extract data 
    this(data); 
} 

Korzystanie this(params) zadzwonić innego konstruktora. W takim przypadku mogę coś podobnego?

Dzięki

Odpowiedz

2

Tak. W C++ 11 możesz to zrobić. Nazywa się constructor delegation.

struct A 
{ 
    A(int a) { /* code */ } 

    A() : A(100) //delegate to the other constructor 
    { 
    } 
}; 
+0

Czy wiesz, które kompilatory obecnie wdrażają tę zmianę, wydaje mi się pamiętać, że Clang jeszcze (na przykład) nie. –

+0

@MatthieuM .: Nie mam pojęcia. Nie testowałem tego z żadnym kompilatorem. :-) – Nawaz

+0

:) Obawiam się, że nie uznano tego za ważne w praktyce, ponieważ delegowanie do prywatnej metody działa już bardzo dobrze (o ile wszystkie atrybuty wspierają przypisanie), a zatem ma niski priorytet dla wszystkich. –

8

Termin szukasz jest "constructor delegation" (lub, bardziej ogólnie, "przykuty konstruktorzy"). Przed wersją C++ 11 te nie istniały w C++. Ale składnia jest jak wywołując konstruktor klasy bazowej:

class Foo { 
public: 
    Foo(int x) : Foo() { 
     /* Specific construction goes here */ 
    } 
    Foo(string x) : Foo() { 
     /* Specific construction goes here */ 
    } 
private: 
    Foo() { /* Common construction goes here */ } 
}; 

Jeśli nie używasz C++ 11, najlepiej można zrobić, to określić prywatną funkcji pomocnika do czynienia z rzeczy wspólnej dla wszystkich konstruktorów (chociaż jest to irytujące dla rzeczy, które chciałbyś umieścić na liście inicjalizacji). Na przykład:

class Foo { 
public: 
    Foo(int x) { 
     /* Specific construction goes here */ 
     ctor_helper(); 
    } 
    Foo(string x) { 
     /* Specific construction goes here */ 
     ctor_helper(); 
    } 
private: 
    void ctor_helper() { /* Common "construction" goes here */ } 
}; 
+0

Podtrzymuję twoją odpowiedź, ponieważ jest bardziej kompletna. Ale przykłady byłyby bardzo miłe. :-) – Omnifarious

+2

@Omnifarious: Przykłady istnieją! –

Powiązane problemy