С ++ функциональный метод через указатель на функцию

Я пытаюсь понять, как работает указатель на функцию, не могу объяснить, почему я получаю следующую ошибку.

#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;
}

Err msg:

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

Проблема с:

  pfunc=&Car::GetCarsNum ();

Любая помощь будет принята с благодарностью

0

Решение

Нет необходимости в родительских обязанностях:

pfunc=&Car::GetCarsNum;

а также

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

О, ОБНОВЛЕНИЕ:
у вас есть статический метод:
В этом случае GetCarsNum () является простой функцией:

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

Другие решения

С &Car::GetCarsNum () ты звонишь GetCastNumи принимая возвращаемое значение, чтобы сделать его указателем (с оператором address-of &).

Чтобы решить эту проблему, просто удалите скобки:

pfunc=&Car::GetCarsNum;
2

Я думаю, что, поместив скобки за метод, вы вызываете метод. Это смущает компилятор. кто сейчас думает & оператор используется в качестве бинарного оператора.
Так что удалите () и укажите только имя функции.

0

Спасибо, парни.
Теперь я вижу разницу между указателями на статический метод (в этом случае мы используем синтаксис как для простой функции)

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

в этом случае как с&и без&дает тот же результат. (и в чем разница).
и называя это:

pfunc();

И другая сторона — указатель функции на стандартный метод:

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

и называя это:

(ptr->*pfunc2)();
0
По вопросам рекламы [email protected]