Как работает этот код? - PullRequest
       3

Как работает этот код?

0 голосов
/ 18 апреля 2011

Я работаю с балансовой единицей, и вижу это:

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

Теперь я никогда не видел этого и не знал, что что-то подобное может сработать (код компилируется в корпоративном решении), поэтому я попробовал это, но мне не повезло. Код не удалось скомпилировать из-за неправильного синтаксиса. Я озадачен тем, как это работает над решением компании ...? Может быть, я что-то пропускаю?

Ответы [ 3 ]

10 голосов
/ 18 апреля 2011

Этот метод называется Метод цепочки . В основном это работает, возвращая ссылку на *this в каждом методе, который вы вызываете. Это позволяет напрямую вызывать другой метод для возвращаемого объекта (называемый цепочкой).

4 голосов
/ 18 апреля 2011

А?Что в этом странного?Не означает ли это, что someFunc() объявлено так:

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

для поддержки цепочки?Так же, как операторы потока?

1 голос
/ 18 апреля 2011

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

Ключ к пониманию такого кода всегда заключается в рассмотрении объявления интересующей функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...