2010-05-20 20 views
5

: en kısa süredeyöntem zincirleme bir sınıfın yapıcı çağrı ayrı deyimi ise oldukça kolay olduğu ortaya çıkıyor C++, örneğin yöntem zincirleme uygulamak çalışıyorum

Foo foo; 

foo.bar().baz(); 

Ama Kurucu çağrısı yöntem zincirinin bir parçası haline geldiğinde, derleyici ";" yerine "." Kurucudan hemen sonra:

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

Bu gerçekten C++ 'da mümkün olup olmadığını merak ediyorum. İşte benim test sınıftır:

class Foo 
{ 
public: 
    Foo() 
    { 
    } 

    Foo& bar() 
    { 
     return *this; 
    } 

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

Ben de Arıyorum tam olarak ne gibi görünüyor C "akıcı arabirimler" ++ (http://en.wikipedia.org/wiki/Fluent_interface#C.2B.2B) için bir örnek buldum. Ancak, bu kod için aynı derleyici hatası alıyorum.

+1

Bu ne bir derleyici? –

+0

Oh, şunu söylemeyi unuttum: Visual Studio 2010 (Professional). – jena

+0

Foo foo = çubuk() baz() bang(); –

cevap

8

Foo nesnesinin gerçek adını unuttunuz. Deneyin:

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

Veya geçici bir yeni değişkene kopyalamak yerine, bir (const) başvurusunu nesneye kaydedebilirsiniz. –

+0

@LokiAstari: maalesef hayır, çünkü baz geçici değil, geçici bir referans döndürür. (Aynı hatayı kendim yaptım) – peterchen

11

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

, bu durumda, geçici bir nesneye bir başvuru döndürmek biraz tehlikeli olabilir ;-) – stefaanv

+5

Burada iyi tanımlanmış yok. Geçici nesne, ifadenin sonuna kadar geçerli kalır (';'). Hepsi aşk ve zamansallıktır. –

1

Hayır, C++ değişken bildirimleri için sözdizimi bunun için izin vermez deneyin - isteğe bağlı bir argüman listesi ile değişken adı veya bir atama operatörü ve bir ifade ya.