PavelK
@PavelK

Как лучше реализовать цепочку вызовов действий одного класса?

Приветствую!
Требуется делать несколько действий над объектом класса по порядку, например:
ClassA * a = new ClassA();
a->method1()->method3()->method2()->methodN()

т.е. примерно как в JQuery
Кстати, как такие цепочки вызовов правильно называются (ибо немогу нагуглить, может вообще вопрос не имеет смысла)?

Класс выглядит примерно так:
class ClassA 
{
public:
    ClassA(int _a, int _b): a(_a), b(_b) {  }
   ClassA * method1(const ClassA & c) {  a+= c.a;  ....   return this;  }
   ClassA * method2(const ClassA & c) {  b+= c.b;  ....   return this;  }
   ClassA * method3(const ClassA & c) {  a*= c.a;  ....   return this;  }
   .......
private:
  int a;
}


Очень интересует вопрос:
что будет быстрее и лучше, возвращать указатель на this, как делается в примере выше или же каждый раз создавать новый экземпляр и возвращать его (
ClassA method1(const ClassA & c) {.... return ClassA(a+c.a, b);  }
), или же вообще по-другому ?

P.S. класс небольшой - до 20 методов, да штук 6 целочисленных переменный. Класс работает только со своими переменными, никуда больше ему лезть не надо. Может наследовать от другого такого же класса.
  • Вопрос задан
  • 402 просмотра
Решения вопроса 2
@Free_ze
Пишу комментарии в комментарии, а не в ответы
Это называется "fluent interface" или "method chaining".

Все зависит от того, что вам нужно:

В jQuery/JS или LINQ/C# возвращаются именно новые объекты.

Хотя в том же EntityFramework есть Fluent API, где методы вызываются на некотором объекте контекста, который настраивается такой цепочкой. В этом случае лучше возвращать ссылку, как это принято делать при перегрузке операторов.
Ответ написан
Daniro_San
@Daniro_San
Программист
А ещё лучше, что бы методы возвращали не указатель, а ссылку.
ClassA &method1(const ClassA &c) 
{
    //.... 
    return *this; 
}

// Использование
a.method1().method3().method2().methodN();
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
maaGames
@maaGames
Погроммирую программы
Немножко оффтоп, но зачем вообще вам такое нужно? Это же невозможно нормально отлаживать. Сами себе проблемы придумываете на ровном месте.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы