2011-04-18 84 views
0

我与公司代码工作,我看到:这段代码是如何工作的?

ClassName(/* bunch of parameters */) 
    .someFunc(/* bunch of parameters */) 
    .someFunc(/* bunch of parameters */) 
    .someFunc(/* bunch of parameters */) 
    ; 

现在,我从来没有看到这一点,不知道这样的事情可以工作(代码编译在该公司的解决方案),所以我试了一下但我没有这样的运气。由于语法不正确,代码无法编译。我很困惑它是如何在公司的解决方案上工作的......?也许我忽略了一些东西?

+0

也许你错过了一些图书馆? – John 2011-04-18 16:26:49

+0

这被称为函数链 - 但正如@约翰说,你可能在某处丢失了一些标题。 – birryree 2011-04-18 16:28:45

回答

10

该技术被称为Method Chaining。它基本上可以通过在您调用的每种方法中返回对*this的引用。这允许您直接调用返回对象上的另一个方法(称为链接)。

+0

只是迂腐:(但一些初学者可能会明确地使用你的答案):但是引用'* this' – 2011-04-18 17:17:15

+0

在C#中,这个库在很多库中很受欢迎,被称为'流利'风格。 – kenny 2011-11-06 21:44:12

4

咦?这有什么奇怪的?这不仅仅意味着someFunc()是这样声​​明的:

ClassName& someFunc(/*arguments*/) 
{ 
    /*do stuff*/ 
    return *this; 
} 

为了支持链接?就像流操作符一样?

+0

doh!我忘记了这个......很早以前我就学习了流操作符,但是因为我从来没有使用过它,或者看到它在其他代码中使用过,所以我从未将它们连接起来。 – Samaursa 2011-04-18 16:39:03

+1

如果你以前从未见过方法链接,我相信这很奇怪。 – 2011-04-18 17:12:45

+0

无论如何这很奇怪,因为emethod链是一种可憎的东西。 – 2011-04-18 17:13:03

1

someObj.someFunc()可能会返回一个参考someObj,像这样:

class ClassName { 
    ClassName &someFunc() { 
     return *this; // return current object, nothing created 
    } 
}; 

ClassName someObj; 

someObj.someFunc().someFunc(); // chain function calls on same object 
ClassName().someFunc().someFunc(); // same, but now object is a temporary 

这也适用于直接对象返回类型,而不是一个参考。在此模式中,可以在每个步骤修改对象。

class ClassName { 
    ClassName increment() const { 
     return *this + 1; // return a newly created object 
    } 
}; 

ClassName someObj; 
someObj.increment().increment(); // does not modify someObj, returns temporary 

理解此类代码的关键始终在于查看感兴趣函数的声明。