2012-11-27 22 views
11

Ho una coppia di costruttori che funzionano perfettamente nello stile C++ 03. Uno dei costruttori chiama un costruttore della superclasse (o classe base) ...Costruttori delegati: un inizializzatore per un costruttore delegante deve apparire da solo

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

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

sto cercando di capire come utilizzare la nuova funzionalità C++ 11 delegante ctor per neaten questo un po '. Tuttavia, il codice seguente dà il seguente errore del compilatore ...

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

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

"un inizializzatore per un costruttore delegare deve apparire solo" ...

Esiste un modo per aggirare questo ??

risposta

9

Il problema è che Rectangle viene inizializzato due volte.

Si potrebbe provare a cambiare quale i delegati a ciò:

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

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

La soluzione migliore è probabilmente per evitare delegare costruttori in questo esempio.

+0

"evita di delegare i costruttori in questo esempio" - Visto che il tuo codice funziona (grazie +1), potresti ampliare il motivo per cui fai questo suggerimento? – learnvst

+0

@learnvst Si comportano come un argomento predefinito di fantasia. Trovo gli argomenti predefiniti o il codice originale per essere più leggibile. – Pubby

+0

Sì, la cosa 'Window (Rectangle())' sembra un po 'strana. Vedo da dove vieni. – learnvst