2010-05-20 35 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

这是什么编译器? – 2010-05-20 19:39:55

+0

哦,我忘了提这个:Visual Studio 2010(Professional)。 – jena 2010-05-20 19:46:01

+0

Foo foo = bar()。baz()。bang(); – 2013-07-12 17:28:51

回答

8

您忘记了Foo对象的实际名称。试试:

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

或者,您可以将(常量)引用保存到对象,而不是将临时对象复制到新变量中。 – 2010-05-20 21:25:54

+0

@LokiAstari:不幸的是没有,因为baz返回一个临时引用,而不是临时引用。 (自己犯了同样的错误) – peterchen 2015-06-12 12:07:43

11

尝试

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

尽管在这种情况下,返回对临时对象的引用有点不礼貌;-) – stefaanv 2010-05-20 19:51:49

+5

在这里没有很好的定义。由于临时对象在声明结束前保持有效(';')。所有的爱情和临时车费。 – 2010-05-20 20:32:24

1

不,C++变量声明的语法不允许为 - 是一个变量名带有可选的参数列表,或赋值运算符和表达式。