2010-05-20 15 views
5

Estoy tratando de poner en práctica el método de encadenamiento en C++, el cual resulta ser muy fácil si la llamada al constructor de una clase es una declaración por separado, por ejemplo:método de encadenamiento incluyendo constructor de la clase

Foo foo; 

foo.bar().baz(); 

Pero tan pronto como la llamada al constructor se convierte en parte de la cadena de métodos, el compilador se queja de que espera ";" en lugar de "." inmediatamente después de la llamada del constructor:

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

Me pregunto ahora si esto es realmente posible en C++. Aquí está mi clase de prueba:

class Foo 
{ 
public: 
    Foo() 
    { 
    } 

    Foo& bar() 
    { 
     return *this; 
    } 

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

También encontré un ejemplo de "interfaces fluidas" en C++ (http://en.wikipedia.org/wiki/Fluent_interface#C.2B.2B) que parece ser exactamente lo que estoy buscando. Sin embargo, obtengo el mismo error de compilación para ese código.

+1

¿Qué compilador es este? –

+0

Ah, olvidé mencionar esto: Visual Studio 2010 (Professional). – jena

+0

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

Respuesta

8

Ha olvidado el nombre real del objeto Foo. Probar:

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

O puede guardar una referencia (const) al objeto en lugar de copiar el temporal en una nueva variable. –

+0

@LokiAstari: lamentablemente no, porque baz devuelve una referencia a un temporal, no temporal. (Hice el mismo error yo mismo) – peterchen

11

Trate

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

aunque en este caso, devolver una referencia a un objeto temporal es un poco dudoso ;-) – stefaanv

+5

No está bien definido aquí. Como el objeto temporal permanece válido hasta el final de la declaración (el ';'). Todo está en amor y provisionales. –

1

No, la sintaxis de las declaraciones de variables C++ no permite que - ya sea un nombre de variable con una lista de argumentos opcional o un operador de asignación y una expresión.

Cuestiones relacionadas