注册 登录
编程论坛 C++教室

如何使用函数指针调用类中的函数和普通函数?

w2009w 发布于 2015-06-27 16:48, 749 次点击
声明一个参数为int型、返回值为long型的函数指针;声明类A的一个成员函数指针,其参数为int型,返回值为long型。
    麻烦看一看错在哪里:
#include<iostream>
using namespace std;

class A
{
public:
    long Sum(int k);
private:
    int n;
};

A::Sum(int k)   //求自然数的前n项和
    {
        int n;
        cout<<"请输入所求前n项和的n:"<<endl;
        cin>>n;
        k=n;
        long sum=0;
        for(int i=0;i<n;i++)
            sum+=i+1;
        cout<<"前"<<n<<"项和="<<sum<<endl;
        return sum;
    }

long func(int m)  //求自然数n的阶乘
{
    int S=1;
    cout<<"请输入所求阶乘的数m:"<<endl;
    cin>>m;
    for(int j=2;j<m+1;j++)
        S*=j;
    cout<<m<<"!="<<S<<endl;
    return 0;
}

int main(){
    A p_fn2;
    long (* p_fn1)(int);
    long ( A::*p_fn2)(int);
    p_fn1=func;
    p_fn2=Sum;
    return 0;
}
8 回复
#2
诸葛欧阳2015-06-27 18:34
前两个函数竟然都写错了,你的sum函数中参数k是干嘛的,func函数的参数m是干嘛的?函数里面你再输入一个值有意思吗
#3
w2009w2015-06-27 19:33
当然有意思啦,要不然能计算是固定的,不能通用,程序就没啥用途了,不要只说啊,把改后的代码贴上来才是王道。
#4
wp2319572015-06-28 09:41
程序代码:
#include<iostream>

using namespace std;

long Sum(int k)   //求自然数的前n项和
{
    long sum=0;
    for(int i=1;i<=k;i++) sum+=i;
    return sum;
}


int main()
{
    long (* p_fn1)(int);
    p_fn1=Sum;
    long s=p_fn1(25);
    printf("s=%d\n",s);
    return 0;
}
#5
yangfrancis2015-06-28 13:07
回复 3楼 w2009w
二楼说得不错
long Sum(int k);
看看这个成员函数,既然你在函数体内接受用户输入数字,这里就不需要参数k了嘛。传入参数的意义是什么,就是把用户输入数据传入函数体内进行处理。也就是说成员函数内不使用cin语句,直接把主函数中赋好值的整数作为传参k,传进去后直接用于for循环,long Sum(int k)才能体现出意义
#6
w2009w2015-06-28 13:19
回复 5楼 yangfrancis
明白了,受教了,不错!
#7
yangfrancis2015-06-28 13:25
回复 3楼 w2009w
#include<iostream>
using namespace std;

class A
{
public:
    long Sum(int k=n);
    void SetValue(int x){n=x;}//这两句与你的功能无关,
    int GetValue(){return n;} //只是为了让你的n有点作用

private:
    int n=1;
};

A::Sum(int k)   //求自然数的前n项和
    {
        for(int i=1;i<=k;i++)
            sum+=i;
        cout<<"前"<<k<<"项和="<<sum<<endl;
        return sum;
    }

long func(int m)  //求自然数n的阶乘
{
    int S=1;
    for(int j=2;j<m+1;j++)
        S*=j;
    cout<<m<<"!="<<S<<endl;
    return 0;
}

int main(){
    A p_fn2;
    cout<<"输入要求前n个自然数的个数:";
    int a,answer1;cin>>a;
    answer1=p_fn2.Sum(a);//得数已在屏幕上输出过,如果其他地方不需要它可不保
                        //留函数返回值
    cout<<"输入要求前n个自然数阶乘的个数:";
    long answer2;
    answer2=func(p_fn2.GetValue());
    return 0;
}
#8
w2009w2015-06-28 14:08
回复 7楼 yangfrancis
好多错误啊!兄弟!
#9
w2009w2015-06-28 14:19
给大家参考一下!哈哈!!!
#include<iostream>
using namespace std;

class A   //定义类A
{
public:
    long Sum(int n)//求自然数的前n项和
        {
        long sum=0;
        for(int i=0;i<n;i++)
            sum+=i+1;
        cout<<"1+2+...+"<<n<<"="<<sum<<endl;
        return sum;
    }
private:
    int n;
};     

long func(int m)  //求自然数m的阶乘
{
    long S=1;
    for(int j=2;j<m+1;j++)
        S*=j;
    cout<<m<<"!="<<S<<endl;
    return S;
}

int main(){
    A a;     //定义类A的对象a
    long (* p_fn1)(int);   //定义指向普通函数的指针
    long (A::*p_fn2)(int)=&A::Sum;  //定义指向类成员函数的指针
    p_fn1=func;
    long S=p_fn1(5);
    a.Sum(5);
    (a.*p_fn2)(5);
    return 0;
}
1