我试图理解函数指针的工作原理无法澄清为什么我会得到以下错误。
#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 ();
非常感谢任何帮助
答案 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)();