2010-05-20 2 views
5

Ich versuche Methode Verkettungs in C++ zu implementieren, die recht einfach zu sein, stellt sich heraus, wenn der Konstruktor Aufruf einer Klasse eine gesonderte Erklärung ist, zum Beispiel:Methode Verkettungs einschließlich Klassenkonstruktors

Foo foo; 

foo.bar().baz(); 

Aber so bald Wenn der Konstruktoraufruf Teil der Methodenkette wird, beschwert sich der Compiler über das Erwarten von ";" anstelle von "." unmittelbar nach dem Konstruktoraufruf:

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

Ich frage mich jetzt, ob dies tatsächlich möglich, in C++ ist. Hier ist mein Test-Klasse:

class Foo 
{ 
public: 
    Foo() 
    { 
    } 

    Foo& bar() 
    { 
     return *this; 
    } 

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

ich auch ein Beispiel für „fließend Schnittstellen“ in C++ (http://en.wikipedia.org/wiki/Fluent_interface#C.2B.2B) gefunden, die genau zu sein scheint, was ich suche. Allerdings bekomme ich den gleichen Compilerfehler für diesen Code.

+1

Welcher Compiler ist das? –

+0

Oh, ich habe vergessen, dies zu erwähnen: Visual Studio 2010 (Professional). – jena

+0

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

Antwort

8

Sie haben den tatsächlichen Namen für das Objekt Foo vergessen. Versuchen Sie:

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

Oder Sie können einen (konstanten) Verweis auf das Objekt speichern, anstatt das temporäre in eine neue Variable zu kopieren. –

+0

@LokiAstari: leider nein, weil baz eine Referenz auf eine temporäre, keine temporäre zurückgibt. (Machte den gleichen Fehler selbst) – peterchen

11

Versuchen

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

obwohl in diesem Fall ein Verweis auf ein temporäres Objekt ist ein bisschen zweifelhaft ;-) – stefaanv

+5

Nein ist es hier gut definiert. Das temporäre Objekt bleibt bis zum Ende der Anweisung gültig (das ';'). Alles ist in Liebe und Provisorien. –

1

Nein, die Syntax für C++ Variablendeklarationen für das nicht erlauben - entweder einen Variablennamen mit einem optionalen Argumentliste oder einen Zuweisungsoperator und einen Ausdruck.