2010-05-20 11 views
5

Sto cercando di implementare il metodo concatenamento in C++, che si rivela essere abbastanza facile se la chiamata al costruttore di una classe è una dichiarazione separata, ad esempio:metodo di concatenamento tra cui costruttore della classe

Foo foo; 

foo.bar().baz(); 

Ma non appena quando la chiamata del costruttore diventa parte della catena del metodo, il compilatore si lamenta di aspettarsi ";" al posto di "." immediatamente dopo la chiamata al costruttore:

Foo foo().bar().baz(); 

Mi chiedo ora se questo è in realtà possibile in C++. Qui è la mia classe di test:

class Foo 
{ 
public: 
    Foo() 
    { 
    } 

    Foo& bar() 
    { 
     return *this; 
    } 

    Foo& baz() 
    { 
     return *this; 
    } 
}; 

Ho trovato anche un esempio per "interfacce fluenti" in C++ (http://en.wikipedia.org/wiki/Fluent_interface#C.2B.2B) che sembra essere esattamente quello che sto cercando. Tuttavia, ottengo lo stesso errore del compilatore per quel codice.

+1

Che compilatore è questo? –

+0

Oh, ho dimenticato di dirlo: Visual Studio 2010 (Professional). – jena

+0

Foo foo = bar(). Baz(). Bang(); –

risposta

8

Hai dimenticato il nome effettivo dell'oggetto Foo. Prova:

Foo foo = Foo().bar().baz(); 
+5

Oppure è possibile salvare un riferimento (const) all'oggetto anziché copiare il temporaneo in una nuova variabile. –

+0

@LokiAstari: sfortunatamente no, perché baz restituisce un riferimento temporaneo, non temporaneo. (Fatto lo stesso errore io stesso) – peterchen

11

Prova

// creates a temporary object 
// calls bar then baz. 
Foo().bar().baz(); 
+0

anche se in questo caso, restituire un riferimento a un oggetto temporaneo è un po 'losco ;-) – stefaanv

+5

Non è ben definito qui. Poiché l'oggetto temporaneo rimane valido fino alla fine dell'istruzione (il ';'). Tutto è pieno di amore e provvisori. –

1

No, la sintassi per C++ dichiarazioni delle variabili non consente che - sia un nome di variabile con una lista di argomenti opzionale o un operatore di assegnazione ed espressione.

Problemi correlati