Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.58
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

Передача указателей на функции в экземпляр класса - C++

10.11.2009, 19:05. Просмотров 3215. Ответов 9
Метки нет (Все метки)

Есть класс главного окна,класс содержит такой метод
C++
1
2
public:
    void pFuncTake( void (*p1)(char *path), void (*p2)(), void (*p3)(),void (*p4)() );
который должен принимать указатели на функции,сохранять и далее по мере надобности с ними работать.Это часть разделяемой библиотеки,указатели на функции я пытаюсь сделать затем,чтобы не подключать внутренние заголовки программы к самой библиотеке.
Реализация проста:
C++
1
2
3
4
5
6
7
8
9
void
MainWindow::pFuncTake( void (*p1)(char *path),void (*p2)(),void (*p3)(), void (*p4)() )
{
   pFunc_parserInit  = p1;
   pFunc_syntaxCheck = p2;
   pFunc_interpRun   = p3;
   pFunc_memoryFree  = p4;
   filename = path;
}
Пытаюсь использовать таким образом:
C++
1
2
MainWindow window;
window.pFuncTake(parser_Init(filename),syntax_Check,interp_Run,memory_Free);
И получаю такую ошибку:
Код
error: invalid use of void expression|
с указанием на строку с вызовом pFuncTake.На момент компиляции есть уже готовая разделяемая библиотека .so ,а в проект подключаются только её заголовки.В чём тут ошибка и как её исправить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2009, 19:05     Передача указателей на функции в экземпляр класса
Посмотрите здесь:
C++ передача функции указателей
C++ Передача указателей в функции
C++ Передача массивов указателей в качестве параметров функции
Создание шаблона bool-функции, принимающей в качестве параметра экземпляр класса C++
Передача двумерного массива указателей на char в качестве параметра функции C++
Использование указателей на функции-члены внутри самого класса C++
Реализовать вызов методов класса с помощью указателей на функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Monte-Cristo
2788 / 1374 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
10.11.2009, 19:15     Передача указателей на функции в экземпляр класса #2
Цитата Сообщение от #pragma Посмотреть сообщение
parser_Init(filename)
функции передаются без параметров. Ты передаешь укзатель на функцию, а не значение функции. Попробуй так:

C++
1
window.pFuncTake(parser_Init,syntax_Check,interp_Run,memory_Free);
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
10.11.2009, 19:28  [ТС]     Передача указателей на функции в экземпляр класса #3
Теперь получаю ошибку такого рода
Код
error: no matching function for call to ‘MainWindow::pFuncTake(_char_t*&, void (&)(const _char_t*), void (&)(), void (&)(), void (&)())’
но я думаю,это уже связано с неправильным использованием кода самой библиотеки? То есть подключения интерфейсов недостаточно,нужно ещё как-то "подгрузить" код?
Monte-Cristo
2788 / 1374 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
10.11.2009, 19:33     Передача указателей на функции в экземпляр класса #4
#pragma, ммм.
посмотри какие параметры в ошибке показывает, и какие передает. Видишь, в ошибке их 5.
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
10.11.2009, 19:40  [ТС]     Передача указателей на функции в экземпляр класса #5
Да,я же везде сменил,их уже 5
C++
1
2
MainWindow window;
window.pFuncTake(filename,parser_Init,syntax_Check,interp_Run, memory_Free);
C++
1
2
public:
       void pFuncTake( char *path,void (*p1)(), void (*p2)(), void (*p3)(), void (*p4)() );
C++
1
2
3
4
5
6
7
8
9
void
MainWindow::pFuncTake( char *path,void (*p1)(),void (*p2)(),void (*p3)(), void (*p4)() )
{
   pFunc_parserInit  = p1;
   pFunc_syntaxCheck = p2;
   pFunc_interpRun   = p3;
   pFunc_memoryFree  = p4;
   strcpy(filename,path);
}
filename у меня имеет тип char*.
Почему я подумал,что надо как-то подключить этот код-просто наткнулся на такой пример
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int main(void) {
         const char *error;
          void *module;
           simple_demo_function demo_function;
 
            /* Load dynamically loaded library */
              module = dlopen("libhello.so", RTLD_LAZY);
              if (!module) {
                        fprintf(stderr, "Couldn't open libhello.so: %s\n",
                              exit(1);
                               }
 
               /* Get symbol */
               dlerror();
               demo_function = dlsym(module, "hello");
                if ((error = dlerror())) {
                           fprintf(stderr, "Couldn't find hello: %s\n", error);
                              exit(1);
                               }
 
                 /* Now call the function in the DL library */
                 (*demo_function)();
 
                  /* All done, close things cleanly */
                  dlclose(module);
                   return 0;
}
отсюда http://mech.math.msu.su/~zubr/library.html
Monte-Cristo
2788 / 1374 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
10.11.2009, 19:58     Передача указателей на функции в экземпляр класса #6
#pragma, твой класс содержиться в дополнительной библиотеки? Если да - библиотеку подлкючать надо. Если же нет (он в исходниках) тогда не надо никаких библиотек.
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
10.11.2009, 20:26  [ТС]     Передача указателей на функции в экземпляр класса #7
Да,сам класс(реализация) находится в коде библиотеки .so,а я подключаю только интерфейс(.h-файл).Значит,мне нужно пользоваться платформенно зависимыми функциями для подгрузки кода библиотеки? То есть для винды это будут одни функции,для Unix систем -другие?
Monte-Cristo
2788 / 1374 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
10.11.2009, 23:46     Передача указателей на функции в экземпляр класса #8
#pragma, мм.. поидеи, раз ты подключил header, то тебе просто нужно стравить библиотеку компилятору. Попробуй просто при компилировании стравить библиотеку компилятору. Ты где пишешь? В средах разработки, это можно в свойствах проекта как правило выставлять. Если же из под командной строки компилируешь - попробуй стравить линкеру. (еси честно, не помню когда травить либу надо.. при линковки, или вместе с другими исходниками )
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
11.11.2009, 01:44  [ТС]     Передача указателей на функции в экземпляр класса #9
Что-то я вообще не понимаю,что происходит.Всё указал,все пути до библиотек,Makefile выглядит в общем виде так:
Код
CXX = g++
CXXFLAGS = -ansi -Wall
DFLAGS = -MD
LD = $(CXX)
LDFLAGS = -lSDL -R/media/ext3/C++/Projects/CodeBlocks/bGUI/libGUI.so
OFILES = debugger.o error_handler.o value_class.o variable_class.o parser.o  \
         syntax.o expression.o statement.o interp.o memory.o array.o label.o \
         options.o function.o lib.o graphics/graphics.o driver.o
CXXFLAGS += -I. -Igraphics -I/usr/share/qt4/mkspecs/linux-g++ -I/usr/include/qt4/QtCore \
                        -I/usr/include/qt4/QtGui -I/usr/include/qt4
LIBS          = $(SUBLIBS)  -L/usr/lib -lQtGui -lQtCore -lpthread
RM = rm -f
TARGET = basin

all: $(TARGET)

$(TARGET): $(OFILES)
	$(LD) $(LDFLAGS) $(OFILES) -o $(TARGET) $(OBJCOMP) $(LIBS)

-include $(OFILES:.o=.d)

%.o : %.cpp
	$(CXX) -c $(DFLAGS) $(CXXFLAGS) $< -o $@

clean:
	$(RM) $(TARGET) *.o *.d *.bak *~* core */*.o */*.d */*.bak *.dat
Получаю странную ошибку при компиляции в консоли:
Код
driver.cpp:79: error: no matching function for call to ‘MainWindow::pFuncTake(_char_t*&, void (&)(const _char_t*), void (&)(), void (&)(), void (&)())’
mainwindow.h:44: note: candidates are: void MainWindow::pFuncTake(void (*)(char*), void (*)(), void (*)(void*), void (*)())
make: *** [driver.o] Error 1
Дело в том,что функции-кандидата вообще не существует! Признаюсь,я такой вариант пробовал,но с того момента уже сделал несколько правок и перекомпиляций библиотеки.Вот точные фрагменты кода,где встречается pFuncTake:
mainwindow.h-интерфейс библиотеки(в описании класса MainWindow)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public:
        MainWindow(QWidget *parent = 0);
        void pFuncTake( _char_t *path,
                        void (*p1)(_char_t *filename1),
                        void (*p2)(),
                        void (*p3)(),
                        void (*p4)() );
         ....
    private:
         .....
        char *filename;
        void (*pFunc_parserInit)(_char_t *filename1); //В эти данные сохраняются указатели на функции
        void (*pFunc_syntaxCheck)();
        void (*pFunc_interpRun)();
        void (*pFunc_memoryFree)();

mainwindow.cpp-код библиотеки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void
MainWindow::pFuncTake( _char_t *path,
                                      void (*p1)(_char_t *filename1),
                                      void (*p2)(),
                                      void (*p3)(),
                                      void (*p4)() )
{
   pFunc_parserInit  = p1;
   pFunc_syntaxCheck = p2;
   pFunc_interpRun   = p3;
   pFunc_memoryFree  = p4;
   strcpy(filename,path);
}

driver.cpp - за пределами библиотеки(использование)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...
#include "mainwindow.h"
_int_t main(int_t argc, _char_t* argv[])
{
    ...
   if (something)
   {
          QApplication app(argc, argv);
          Q_INIT_RESOURCE(dockwidgets);
          MainWindow window;
          window.pFuncTake(filename,parser_Init,syntax_Check,interp_Run,
                                                                   memory_Free);
          window.resize(640, 480);
          window.show();
   }
   ...

Всё.Больше эта функция нигде не присутствует.Может каким-то образом "откуда-то" компилятор видит старые объектники,чудесным образом где-то сохранившиеся? Но я ничего не менял такого.Чудеса прямо..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2009, 04:37     Передача указателей на функции в экземпляр класса
Еще ссылки по теме:
C++ Создать экземпляр класса без явного указания членов класса
Как сделать членом класса экземпляр этого же класса C++
Вызов методов класса из двойного указателя на экземпляр класса C++
Обращение к методам класса через указатель на экземпляр класса C++
C++ Может ли метод класса возвращать экземпляр этого же класса?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
11.11.2009, 04:37  [ТС]     Передача указателей на функции в экземпляр класса #10
Всё,я разобрался,всё из-за невнимательности,просто у меня инклуды от библиотеки валялись в проекте необновлёнными(я делаю библиотеку в отдельном проекте),и я про них совсем забыл,что они там есть )).Monte-Cristo,спасибо за помощь )
Yandex
Объявления
11.11.2009, 04:37     Передача указателей на функции в экземпляр класса
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru