Как я могу вызвать функциональный объект изнутри себя? Кажется я не могу использовать this
, Пример:
class factorial {
public:
int operator()(int n) {
if (n == 0)
return 1;
return n * ??(n-1);
}
};
Что я ставлю на ??
?
#include <iostream>
class factorial {
public:
int operator()(int n) {
if (n == 0)
return 1;
return n * (*this)(n-1);
}
};
int main()
{
std::cout << factorial()(5) << std::endl;
}
У меня отлично работает. Живой пример.
Вы можете использовать имя перегруженного оператора:
operator()(n-1);
или вызовите оператор для текущего объекта:
(*this)(n-1);
Как DyP
упоминается, вы можете позвонить (*this)(n-1)
, Тем не менее, это странно читать, так что вам лучше разбить его на отдельные calculate_factoral
метод и вызов этого вместо
Как указали несколько человек, вы можете просто использовать (*this)(n - 1)
синтаксис. Но этот синтаксис не совсем интуитивно понятен, и несколько лучшим решением может быть фактическая реализация в другой именованный метод.
class factorial {
public:
int operator()(int n) {
return impl(n);
}
private:
int impl(int n) {
// actual work here
}
};
Вы можете использовать явный синтаксис оператора:
class factorial {
int operator()(int n) {
if (n == 0)
return 1;
return n * operator()(n-1);
}
};
Или разыменование this
:
class factorial {
int operator()(int n) {
if (n == 0)
return 1;
return n * (*this)(n-1);
}
};
факториал наверняка?
Я знаю только Java и рекурсивный факториал можно записать так:
public class Factorial{
public int factorial(int n) {
return (n > 1) ? n * factorial(n-1) : 1;
}
}
Я предполагаю, что применяется тот же принцип.