这段代码是如何工作的?

时间:2011-04-18 16:25:51

标签: c++ visual-studio-2008

我正在使用公司代码,我看到了:

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

现在我从来没有见过这个并且不知道这样的东西可以工作(代码在公司解决方案中编译)所以我尝试了但是我没有运气。由于语法不正确,代码无法编译。我很困惑它如何处理公司的解决方案......?也许我忽略了什么?

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:4)

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

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

为了支持链接?就像流媒体运营商一样?

答案 2 :(得分: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

理解这些代码的关键在于查看感兴趣的函数的声明。