Установка указателя на функцию в конструкторе класса … ‘& amp;’ : недопустимая операция с выражением связанной функции-члена

Я пытаюсь установить указатель функции на конструктор класса.

Я получаю следующую ошибку:

Ошибка 1 ошибка C2276: ‘&’: недопустимая операция с выражением связанной функции-члена

Кто-нибудь может посоветовать, пожалуйста, почему это происходит (код ниже)?

Редактировать:

Этот пример проблемы лучше показывает мою ситуацию. Я ТОЛЬКО могу изменить MyClass. Я не могу коснуться MyBase или его содержимого.

class MyBase
{
public:

void (*MyFunctionPointer)(int args);

};

class MyClass : public MyBase
{
public:

void MyFunction(int args)
{
}

MyClass()
{
MyFunctionPointer = &MyFunction;
}
};

int _tmain(int argc, _TCHAR* argv[])
{
MyClass temp;

return 0;
}

[/ NOEDIT]

1

Решение

Указатели на функции методов различаются по типу: от указателей на глобальные функции и статические методы.

class MyClass;

class MyBase
{
public:

void (MyClass::* MyFunctionPointer)(int);

};

class MyClass : public MyBase
{
public:

void MyFunction(int args)
{
}

MyClass()
{
MyFunctionPointer = &MyClass::MyFunction;
}
};

int main(int argc, char* argv[])
{
MyClass temp;

return 0;
}

Если вы не можете изменить MyBase, то вы не можете использовать член MyFunctionPointer потому что это указатель типа на глобальную функцию или статический метод. Если вы сообщите нам, чего именно вы пытаетесь достичь, возможно, мы сможем вам помочь.

Редактировать 2 (op ed):

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

class MyBase
{
public:

void (*MyFunctionPointer)(int args);

};

class MyClass : public MyBase
{
public:

void MyFunction(int args)
{
}

void Bind(void (*myFunctionPointer)(int args))
{
MyFunctionPointer = myFunctionPointer;
}
};

void MyFunction2(int args)
{
}

int _tmain(int argc, _TCHAR* argv[])
{
MyBase temp1;
temp1.MyFunctionPointer = &MyFunction2;        // <<-- ok
temp1.MyFunctionPointer(0);

MyClass temp2;
temp2.Bind(&temp2.MyFunction);  // <<-- compile error
temp2.MyFunctionPointer(0);

return 0;
}

[/ NOEDIT]

Редактировать:

Как сказано выше, указатель на функции и указатель на методы — это разные типы. То есть указателю на функцию нельзя назначить адрес метода, а указателю на метод нельзя назначить адрес функции. Вы можете иметь 2 указателя, один указатель типа на функцию и другой указатель на метод и логическое значение, которое говорит вам, какой из двух вы используете. Или вы можете использовать шаблоны.

1

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

MyFunction это член функция, но MyFunctionPointer является указателем базовой функции.

Вы должны изучить синтаксис для производства указатель на член-функцию.

1

По вопросам рекламы [email protected]