指向不是类成员的函数的指针(是类成员) [英] Pointer(is a class member) to a function that is not a class member
问题描述
double getSalary(int v,double s){return v*s;}
double getSalary(double s){return s/2;}
double getSalary(){return 1000;}
class person{ //the class is not inherited, so I can''t use virtual
public:
char name[20];
int age;
double salary;
person(char* num="Anonim",int a=0,double s=0):age(a),salary(s)
{
strcpy(name,num);
}
//...methods...
double (*person::getSalary)() //I have also tried without personand many others...
};
void main(){
person p("John",25,3000);
cout<<"Salary is "<<p.getSalary /*not sure that this is the right way to call it, but i don''t think this is the main mistake, also please correct me here*/
}
请告诉我如何在类中声明一个指向getSalary()的指针,在此示例中,我需要函数的第3个版本.我认为编译器会基于函数自动知道要调用的3个之一'' s签名.我没有编译错误,但在运行时会刹车.我尝试调试它,它表明指针为空.
Please tell me how to declare inside the class a pointer to getSalary(),in this example I want the 3rd version of the function.I thought that the compiler automatically knows wich one of the 3 I want to call, baseing on function''s signature.I have no compileing error but it brakes on run-time.I have tried to debug it, it seams that the pointer is empty.
推荐答案
未初始化函数指针person::getSalary
.取消引用此指针会导致崩溃.
在调用p.getSalary();
之前使用p.getSalary= getSalary;
,希望编译器知道选择哪种重载.
You do not initialize the function pointerperson::getSalary
. Dereferencing this pointer leads to a crash.
Usep.getSalary= getSalary;
before invokingp.getSalary();
hoping that the compiler will know what overload to pick.
您的示例将始终仅应调用
Hi,
Your example will always should call
getSalary()
.
因为您的函数指针是
only.
Because your function pointer is of type
(*person::getSalary)()
类型,其中没有参数.
我没有用真实的代码对其进行测试,但这在逻辑上是隐含的.
where there is no parameters.
I have not tested it with the real code , but this is what logically implies.
该示例有几处错误,但我会坚持提出的问题.
声明"double (*person::getSalary)();
"不应已编译.
指向成员函数的指针的声明将是
double (person::*getSalary)();
.
由于您的代码示例暗示您要指向全局函数,因此正确的声明应为
double (*getSalary)();
.
以下内容将为您提供总体思路.
There are several things wrong with the example, but I will stick with the question asked.
The declaration "double (*person::getSalary)();
" should not have compiled.
The declaration of a pointer to a member function would be
double (person::*getSalary)();
.
Since your code example implies you want to point to a global function the correct declaration would be
double (*getSalary)();
.
The following should give you the general idea.
#include <cstring>
double getSalary(int v, double s) { return v * s; }
double getSalary(double s) { return s/2; }
double getSalary() { return 1000; }
class person
{
public:
char name[20];
int age;
double salary;
person(char* num="Anonim",int a=0, double s=0) : age(a), salary(s)
{
strcpy(name,num); // dangerous: length of num is unknown
getSalary = ::getSalary;
getIt = ::getSalary;
}
// pointer to global function with signature of
// double (*)()
double (*getSalary)();
// same thing with a different varaible name for the pointer
double (*getIt)();
};
void test()
{
person p("John",25,3000);
std::cout << "Salary is " << p.getSalary() << std::endl;
std::cout << "Salary is " << p.getIt() << std::endl;
}
这篇关于指向不是类成员的函数的指针(是类成员)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!