2012-11-27 26 views
11

Mam parę konstruktorów, które działają dobrze w stylu C++ 03. Jeden z konstruktorów nazywa nadklasą (lub konstruktora klasy bazowej) ...Delegowanie konstruktorów: inicjator dla delegującego konstruktora musi pojawić się samodzielnie

class Window : public Rectangle 
{ 
public: 
    Window() : win(new RawWindow(*this)) 
    { 
     refresh(); 
    } 

    Window(Rectangle _rect) : Rectangle(_rect), win(new RawWindow(*this)) 
    { 
     refresh(); 
    } 
... 

Próbuję dowiedzieć się, jak korzystać z nowych funkcji C++ 11 delegujący konstruktor neaten to się trochę. Jednak poniższy kod daje następujący błąd kompilatora ...

class Window : public Rectangle 
{ 
public: 
    Window() : win(new RawWindow(*this)) 
    { 
     refresh(); 
    } 

    Window(Rectangle _rect) : Rectangle(_rect), Window(){} 

„inicjator o przekazaniu konstruktora musi pojawić sam” ...

Czy istnieje sposób wokół to ??

Odpowiedz

9

Problemem jest to, że Rectangle jest uzyskiwanie zainicjowany dwukrotnie.

Można spróbować zmienić których jeden przekazuje się co:

Window(Rectangle _rect) : Rectangle(_rect), win(new RawWindow(*this)) 
{ 
    refresh(); 
} 

Window() : Window(Rectangle()) {} 

Najlepszym rozwiązaniem jest prawdopodobnie uniknąć delegowania konstruktorów w tym przykładzie.

+0

"unikaj delegowania konstruktorów w tym przykładzie" - Czy widzisz, jak działa Twój kod (dzięki +1), mógłbyś wyjaśnić, dlaczego robisz tę sugestię? – learnvst

+0

@learnvst Działają jako fantazyjny domyślny argument. Domyślne argumenty lub oryginalny kod są dla mnie bardziej czytelne. – Pubby

+0

Tak, rzecz 'Window (Rectangle())' wygląda trochę dziwnie. Widzę, skąd przybywasz. – learnvst