C ++函数方法通过函数指针

时间:2014-05-05 14:11:26

标签: c++ function-pointers class-method

我试图理解函数指针的工作原理无法澄清为什么我会得到以下错误。

#include <iostream>

using namespace std;
enum COLOR {RED,BLACK,WHITE};

class Car
{public:
 Car (COLOR c): color(c) { cout<<"Car's constructor..."<<endl; CarsNum++;}
 ~Car () {cout<<"Car's destructor..."<<endl; CarsNum--;}
 void GetColor () { cout<<"Color of the car is"<<color<<endl;}
 static int GetCarsNum () {cout<<"Static membet CarsNum="<<CarsNum<<endl; return 0;}
private:
COLOR color;
static int CarsNum;

};

int Car::CarsNum=0;

int main()
{
int (Car::*pfunc) () = NULL;
pfunc=&Car::GetCarsNum ();


 Car *ptr= new Car(RED);
 ptr->GetColor ();
 ptr->GetCarsNum ();
 delete ptr;
 ptr=0;
 Car::GetCarsNum();
    return 0;
}

错误信息:

  

main.cpp|23|error: lvalue required as unary '&' operand

问题在于:

  pfunc=&Car::GetCarsNum ();

非常感谢任何帮助

4 个答案:

答案 0 :(得分:2)

使用&Car::GetCarsNum (),您正在调用GetCastNum,并使用返回值使其成为指针(使用地址 - 运算符&)。

要解决此问题,只需删除括号:

pfunc=&Car::GetCarsNum;

答案 1 :(得分:1)

不需要父母:

pfunc=&Car::GetCarsNum;

int (Car::*pfunc) () = NULL;

哦,更新: 你有静态方法: 在这种情况下,GetCarsNum()只是一个简单的函数:

int (*pfunc) () = &Car::GetCarsNum;

答案 2 :(得分:0)

我认为通过在方法后面添加大括号,可以调用方法。这会混淆编译器。谁现在认为&amp;运算符用作二元运算符。 因此,删除()并仅指定函数名称。

答案 3 :(得分:0)

谢谢,伙计们。 现在我看到指向静态方法的指针之间的差异(在这种情况下,我们使用syntaxis作为简单函数)

int (*pfunc) () = &Car::GetCarsNum;

在这种情况下,使用&#39;&amp;&#39;没有&#39;&amp;&#39;给出相同的结果。(和有什么区别)。 并称之为:

pfunc();

和标准方法上的其他副功能指针:

void (Car::*pfunc2) () = NULL;
pfunc2=&Car::GetColor;

并称之为:

(ptr->*pfunc2)();