如何将类中的公共函数作为参数传递给另一个函数。

时间:2015-08-18 02:48:07

标签: c++ function oop pointers parameters

我试图通过" get"我班级中的函数,作为"显示"的参数。我班外的功能。 我已经在网上查找了如何做到这一点,并且似乎没有任何明确说明。 AAMOI-你可以在没有指针的情况下做到这一点。

#include <iostream>
using namespace std;
class student{
public:
    void setVAr(int x, int y, int z){
        phone=x;
        house=y;
        rollno=z;
    };
    int getPhone(){
         return phone;
    };
    int getHouse(){
        return house;
    };
    int getRollno(){
        return rollno;
    };
private:
    int phone;
    int house;
    int rollno;
};
void display(student anyStu, int * funcA, int * funcB, int * funcC);
int main(){
    int x=0,y=0,z=0;
    student jack;
    cout<<"Please enter in your phone no:"<<endl;
    cin>>x;
    cout<<"Please enter in your house no.: "<<endl;
    cin>>y;
    cout<<"Enter your rollno: "<<endl;
    cin>>z;
    jack.setVAr(x,y,z);

    cout<<"Your Phone no is: "<<jack.getPhone()<<endl;
    cout<<"Your house no: "<<jack.getHouse()<<endl;
    cout<<"Your rollno no: "<<jack.getRollno()<<endl;
    display(jack,&jack.getPhone(),&jack.getHouse(),&jack.getRollno());
};
void display(student anyStu,int * funcA, int * funcB, int * funcC){
    cout<<"Your Phone no is: "<<anyStu.getPhone()<<endl;
    cout<<"Your house no: "<<anyStu.getHouse()<<endl;
    cout<<"Your rollno no: "<<anyStu.getRollno()<<endl;
};

2 个答案:

答案 0 :(得分:2)

首先,通过引用传递anyStu,例如void display( const student &anyStu, ... ),这样您就不会复制对象(并将其设为const以表示您没有修改它)。还要使get函数const像这样int getHouse() const {;第二,如果你已经有了参考,为什么不只是使用get函数(例如anyStu.getPhone())而不是尝试传递它们(由于它们是实例的一部分,你不能这样做)?如果不适合,接口类可能是有序的......

void display(const student &anyStu){
    cout<<"Your Phone no is: "<<anyStu.getPhone()<<endl;
    cout<<"Your house no: "<<anyStu.getHouse()<<endl;
    cout<<"Your rollno no: "<<anyStu.getRollno()<<endl;
};

并打电话:

display(jack);

答案 1 :(得分:1)

您的代码示例为什么并不完全清楚,但我认为您正在寻找的是指向成员的指针功能。例如,这会创建一个指向名为getPhone的成员函数funcA的指针:

int(student::*funcA)() = &student::getPhone;

或者在C ++ 11中:

auto funcA = &student::getPhone;

然后您可以通过执行以下操作来调用它:

(jack.*funcA)()

我更喜欢使用typedef或C ++ 11 using别名作为指针到成员函数,因为语法可能有点令人困惑。然后你的例子,结合马克的一些建议,看起来像:

#include <iostream>

class student {
public:
    void setVAr(int x, int y, int z){
        phone=x;
        house=y;
        rollno=z;
    }
    int getPhone() const { return phone; }
    int getHouse() const { return house; }
    int getRollno() const { return rollno; }
private:
    int phone;
    int house;
    int rollno;
};

using Func = int (student::*)() const;  // C++11
//typedef int(student::Func*)() const;  // C++98

void display(const student& anyStu, Func funcA, Func funcB, Func funcC){
    std::cout<<"A: "<<(anyStu.*funcA)()<<"\n";
    std::cout<<"B: "<<(anyStu.*funcB)()<<"\n";
    std::cout<<"C: "<<(anyStu.*funcC)()<<"\n";
}

int main(){
    student jack;
    jack.setVAr(911,42,1);

    display(jack, &student::getPhone, &student::getHouse, &student::getRollno);
}

Live demo

您还可以考虑使用C ++ 11 std::function而不是指向成员的指针功能。您的函数类型可以是一个函数,它将student作为参数并返回一个int。然后,您可以使用lambda来包装成员函数:

#include <functional>

using Func = std::function<int(const student&)>;

void display(const student& anyStu, Func funcA, Func funcB, Func funcC){
    std::cout<<"A: "<<funcA(anyStu)<<"\n";
    std::cout<<"B: "<<funcB(anyStu)<<"\n";
    std::cout<<"C: "<<funcC(anyStu)<<"\n";
}

int main(){
    student jack;
    jack.setVAr(911,42,1);

    auto getPhone = [](const student& s){ return s.getPhone(); };
    auto getHouse = [](const student& s){ return s.getHouse(); };
    auto getRollno = [](const student& s){ return s.getRollno(); };

    display(jack, getPhone, getHouse, getRollno);
}

Live demo