一 利用构造函数求解
每个实例化都会调用构造函数,同时静态变量使得变量只有一个副本,每次实例化后值的改变影响一直存在。
class Temp
{
public:
Temp(){++n;sum+=n;} //++n从1开始
static void Rest(){n=0;sum=0}
static unsigned int GetSum(){return sum;}
private:
static unsigned int n;
static unsigned int sum;
};
unsigned int Temp::n=0;
unsigned int Temp::sum=0;
unsigned int sum1(unsigned int n)
{
Temp::Rest(); //再次调用时初始化
Temp *p=new Temp[n](); //()表示初始化为0
delete[] p; //delete[]只是释放指针所指向的内存空间,指针还是指向空间地址
p=NULL;
Temp::GetSum();
}
二 利用虚函数求解
如果希望通过基类的指针指向派生类的对象,并且访问某个与基类同名的成员,那么将这个同名函数声明为虚函数,虚函数声明只能在出现类的定义中
class A;
A* Array[2];
class A
{
public:
virtual unsigned int Sum (unsigned int n)
{
return 0;
}
};
class B: public A
{
public:
virtual unsigned int Sum (unsigned int n) //virtual可以不使用,因为系统会根据3方面的检查自动确定为虚函数
{
return Array[!!n]->Sum(n-1) + n; //当n不为0时,为Array[1]指向子类的函数,,n为0时,为Array[0],指向基类的函数
}
};
int Sum2(int n)
{
A a;
B b;
Array[0] = &a; //Array[]为指向基类对象的指针
Array[1] = &b;
int value = Array[1]->Sum(n);
return value;
}
三 利用函数指针来求解
typedef unsigned int (*fun)(unsigned int); //定义指针类型的函数fun
unsigned int Solution3_Teminator(unsigned int n)
{
return 0;
}
unsigned int Sum_Solution3(unsigned int n)
{
static fun f[2] = {Solution3_Teminator, Sum_Solution3}; //两个函数的指针,
return n + f[!!n](n - 1); //为n不为0 ,函数指针指向Sum_Solution3,n为0函数指针指向Solution3_Teminator
}
四 利用模板类型求解
n必须在编译期间就能确定,不能动态输入,递归代码深度有限制,n不能太大
template <unsigned int n> struct Sum_Solution4
{
enum Value { N = Sum_Solution4<n - 1>::N + n};
};
template <> struct Sum_Solution4<1>
{
enum Value { N = 1};
};
template <> struct Sum_Solution4<0>
{
enum Value { N = 0};
};