递归调用函数对象

时间:2013-07-29 15:41:35

标签: c++ function-object

如何从内部调用函数对象?似乎我无法使用this。例如:

class factorial {
  public:
  int operator()(int n) {
    if (n == 0)
      return 1;
    return n * ??(n-1);
  }
};

我在??放置了什么?

6 个答案:

答案 0 :(得分:13)

#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;
}

对我来说很好。 Live example.

答案 1 :(得分:9)

您可以使用重载运算符的名称:

operator()(n-1);

或在当前对象上调用运算符:

(*this)(n-1);

答案 2 :(得分:4)

如上所述DyP,您可以致电(*this)(n-1)。但是,阅读起来很奇怪,所以你最好把它拆分成一个单独的calculate_factoral方法并调用它来代替

答案 3 :(得分:2)

有几个人指出你可以使用(*this)(n - 1)语法。但是这种语法并不完全直观,稍微好一点的解决方案可能是将实际实现分解为另一个命名方法。

class factorial { 
public:
  int operator()(int n) {
    return impl(n);
  }
private:
  int impl(int n) { 
    // actual work here 
  }
};

答案 4 :(得分:1)

您可以使用显式运算符语法:

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);
  }
};

答案 5 :(得分:0)

肯定是阶乘的吗?

我只知道Java和递归因子可以写成:

public class Factorial{

    public int factorial(int n) {
        return (n > 1) ? n * factorial(n-1) : 1;
    }
}

我认为同样的原则适用。