Здравствуйте, regnar, Вы писали:
R>Согласны ли вы с утверждением, что методы класса не должны возвращать void, вместо этого должны возвращать ссылку на *this?
Зачем? Чтоб писать портянки вызовов в одну строчку?
Не C++-style
Здравствуйте, regnar, Вы писали: R>Согласны ли вы с утверждением, что методы класса не должны возвращать void, вместо этого должны возвращать ссылку на *this?
struct A
{
A& set_a(int a_)
{
a = a_;
return *this;
}
int a;
};
struct B : A
{
B& set_b(int b_)
{
b = b_;
return *this;
}
int b;
};
void main()
{
B b;
b.set_a(1).set_b(2); // О куррррьва! Не комплируется, тип срезался!
}
Из-за этого область применения return *this сильно сужается.
Здравствуйте, regnar, Вы писали:
R>Согласны ли вы с утверждением, что методы класса не должны возвращать void, вместо этого должны возвращать ссылку на *this?
Все операторы присваивания должны возвращать *this.
Здравствуйте, _NN_, Вы писали: _NN>Вы просто неправильно готовите C++
Да я понимаю, что для каждого конкретного случая разрулить можно, но в случае топикстартера, мне кажется, оно того не стоит.
Например, оператор << для сериализации в поток. Как только мы попытаемся реализовать иерархию потоков, как опять же впилимся в подобную проблему — оператор сдвига, реализованный для предка, будет срезать тип потока для последующих операндов. И опять же решаемо — нужно заменить перегрузку оператора сдвига на перегрузку свободной функции, а для оператора сдвига реализовать универсальный шаблон. И так далее, но тут хоть смысл какой-то есть. А писать сеты через точку в строчку — это сомнительное вознаграждение за то, чтобы городить шаблоны.
Здравствуйте, Went, Вы писали:
W>Здравствуйте, _NN_, Вы писали: _NN>>Вы просто неправильно готовите C++ W>Да я понимаю, что для каждого конкретного случая разрулить можно, но в случае топикстартера, мне кажется, оно того не стоит. W>Например, оператор << для сериализации в поток. Как только мы попытаемся реализовать иерархию потоков, как опять же впилимся в подобную проблему — оператор сдвига, реализованный для предка, будет срезать тип потока для последующих операндов. И опять же решаемо — нужно заменить перегрузку оператора сдвига на перегрузку свободной функции, а для оператора сдвига реализовать универсальный шаблон. И так далее, но тут хоть смысл какой-то есть. А писать сеты через точку в строчку — это сомнительное вознаграждение за то, чтобы городить шаблоны.
Это называется extension method — когда функция пишется в инфиксном стиле, — arg1.foo(other args...) = ::foo(arg1, other args...)
Есть в C# и Ruby.
Здравствуйте, regnar, Вы писали:
R>Согласны ли вы с утверждением, что методы класса не должны возвращать void, вместо этого должны возвращать ссылку на *this?
Здравствуйте, regnar, Вы писали:
R>Согласны ли вы с утверждением, что методы класса не должны возвращать void, вместо этого должны возвращать ссылку на *this?
Нет, не согласен, т.к. не вижу смысла.
Здравствуйте, Dair, Вы писали:
R>>Согласны ли вы с утверждением, что методы класса не должны возвращать void, вместо этого должны возвращать ссылку на *this? D>Все операторы присваивания должны возвращать *this.
Здравствуйте, regnar, Вы писали:
R>Согласны ли вы с утверждением, что методы класса не должны возвращать void, вместо этого должны возвращать ссылку на *this?
Я согласен. Не могу сказать за все методы, но то, что push_back не возвращает ссылку меня раздражает.