2012-11-21 4 views
1

Возможные Дублировать:
Disabling “bad function cast” warning"значение типа "пустоте (exeCallback :: *) (INT)" не могут быть отнесены к сущности типа "пустоте (*) (Int)""

Я пытаюсь обернуть свой мозг вокруг указателей функций C++. Чтобы сохранить базовый уровень обучения, я создал пример указателя функции тестирования. В конце концов, я хотел бы передать полностью готовые экземпляры объектов по ссылке, чтобы я мог вызвать метод объекта; однако, ради изучения и понимания, я хотел бы остановиться на основах указателей функций C++. Я создал рабочий пример, используя только файл .cpp, но часть, которой я не преуспеваю, - это использование указателей функций в .cpp и .h. Что я не делаю правильно, чтобы мой пример обучения успешно работал при использовании файлов .cpp и .h?

Я создал два файла exeCallback.h и exeCallback.cpp.

.h файл

/* 
File: exeCallback.h 

Header file for exeCommand Library. 
*/ 

#ifndef EXECALLBACK_H 
#define EXECALLBACK_H 

#include "mbed.h" 

#include <map> 

class exeCallback 
{ 
public: 
    exeCallback(); 

    void my_int_func(int x); 

    void (*foo)(int); 
private: 
}; 

#endif 

.cpp файл:

/* 
File: exeCallback.cpp 

Execute functions in other Sensor libraries/classes 

Constructor 
*/ 

#include "mbed.h" 
#include "ConfigFile.h" 
#include "msExtensions.h" 
#include "cfExtensions.h" 
#include "exeCallback.h" 

exeCallback::exeCallback() 
{ 

    foo = &exeCallback::my_int_func; 

    /* call my_int_func (note that you do not need to write (*foo)(2)) */ 
    foo(2); 

} 

void exeCallback::my_int_func(int x) 
{ 
    printf("%d\n", x); 
} 
+0

http://stackoverflow.com/questions/130322/how-do-you-pass-a-member-function-pointer – SomeWittyUsername

+1

Если возможно, ознакомьтесь с ['std :: function'] (http: // en .cppreference.com/w/cpp/utility/function/function) и ['std :: bind'] (http://en.cppreference.com/w/cpp/utility/functional/bind). Класс 'std :: function' позволяет создать общую оболочку функций, которая может содержать любой тип функции, а функция' std :: bind' позволяет привязать любую функцию к переменной типа функции. –

+0

@JoachimPileborg и вариационный конструктор 'std :: function' позволяет вам выполнять привязку в некоторых случаях без явного использования' std :: bind', что приятно. – juanchopanza

ответ

2

ошибка говорит вам, что вы пытаетесь присвоить указатель на функцию-член к указателем на объект (не участник) функция. См. [Здесь] (Ошибка сообщает вам, что вы пытаетесь назначить указатель на функцию-член указателю на функцию (не являющуюся членом).) Для получения дополнительной информации о различиях. Похоже, что вам нужно объявить foo, как

void (exeCallback::*foo)(int); 

Или сделать вашу жизнь проще с помощью std::function (или boost::function, если у вас нет C++ 11 поддержки).

+0

Я посмотрю ваше предложение, как только я получу базовое понимание и рабочий пример. Я верю, что я почти там. Ошибка, которую я получаю сейчас: «выражение должно иметь тип функции« указатель-к-»». Затем я попробовал exeCallback-> foo (2), но теперь я получаю следующие две ошибки: ожидаемый идентификатор и ожидаемый спецификатор типа – dottedquad

+1

@dottedquad, возможно, было бы проще, если бы вы показали, как вы хотите использовать код. Но функции-члены принимают неявный указатель на объект типа своего параметра класса в качестве первого аргумента. Таким образом, вам, вероятно, понадобится 'foo (this, 2);' внутри вашего обратного вызова. – juanchopanza

+0

@juanchopanzo В конце концов я хотел бы выполнить функцию из текста, полученного через последовательную связь. Итак, я не знаю, как показать код в строках «как я хотел бы использовать код», потому что я все еще пытаюсь получить базовый рабочий пример указателей на функции. Прошу прощения, что я не могу помочь, пытаясь объяснить, чего я пытаюсь выполнить. – dottedquad

Смежные вопросы