2010-05-20 3 views
5

Я пытаюсь реализовать метод цепочки в C++, который оказывается довольно легко, если вызов конструктора класса есть отдельный оператор, например:метод цепочки, включая конструктор класса

Foo foo; 

foo.bar().baz(); 

Но как только поскольку вызов конструктора становится частью цепочки методов, компилятор жалуется на ожидание «;» на месте "." сразу после того, как конструктор вызывает:

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

Мне интересно, возможно ли это на C++. Вот мой тестовый класс:

class Foo 
{ 
public: 
    Foo() 
    { 
    } 

    Foo& bar() 
    { 
     return *this; 
    } 

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

Я также нашел пример для «беглых интерфейсов» в C++ (http://en.wikipedia.org/wiki/Fluent_interface#C.2B.2B), который, как представляется, именно то, что я искал. Тем не менее, я получаю ту же ошибку компилятора для этого кода.

+1

Какой это компилятор? –

+0

О, я забыл упомянуть об этом: Visual Studio 2010 (Professional). – jena

+0

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

ответ

8

Вы забыли фактическое название объекта Foo. Попытка:

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

Или вы можете сохранить ссылку (const) на объект, а не копировать временную в новую переменную. –

+0

@LokiAstari: к сожалению нет, потому что baz возвращает ссылку на временную, а не временную. (Сделала ту же самую ошибку) – peterchen

11

Попробуйте

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

, хотя в этом случае возврат ссылки на временный объект немного изворотливый ;-) – stefaanv

+5

Нет здесь его четко обозначенного. Поскольку временный объект остается действительным до конца инструкции (';'). Все это в любви и во времени. –

1

Нет, синтаксис для объявления переменных в C++ не допускает, что - либо имя переменной с необязательным списком аргументов, или оператор присваивания и выражения.

Смежные вопросы