我试图通过" 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;
};
答案 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);
}
您还可以考虑使用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);
}