8

如何从自身内部调用函数对象?好像不能用this。例子:

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

我放在什么位置??

4

6 回答 6

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

对我来说很好。活生生的例子。

于 2013-07-29T15:45:31.647 回答
9

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

operator()(n-1);

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

(*this)(n-1);
于 2013-07-29T15:49:39.047 回答
4

如前所述DyP,您可以调用(*this)(n-1). 然而,读起来很奇怪,所以你最好把它分成一个单独的calculate_factoral方法并调用它

于 2013-07-29T15:46:22.227 回答
2

正如一些人指出的那样,您可以只使用(*this)(n - 1)语法。但是这种语法并不完全直观,更好的解决方案可能是将实际实现分解到另一个命名方法中。

class factorial { 
public:
  int operator()(int n) {
    return impl(n);
  }
private:
  int impl(int n) { 
    // actual work here 
  }
};
于 2013-07-29T15:48:43.977 回答
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);
  }
};
于 2013-07-29T15:53:52.237 回答
0

肯定是阶乘?

我只知道Java,递归阶乘可以写成:

public class Factorial{

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

我假设同样的原则也适用。

于 2013-07-29T15:48:10.013 回答