Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/34: Рейтинг темы: голосов - 34, средняя оценка - 4.79
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926

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

10.11.2009, 19:05. Показов 6462. Ответов 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);
И получаю такую ошибку:
Code
1
error: invalid use of void expression|
с указанием на строку с вызовом pFuncTake.На момент компиляции есть уже готовая разделяемая библиотека .so ,а в проект подключаются только её заголовки.В чём тут ошибка и как её исправить?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.11.2009, 19:05
Ответы с готовыми решениями:

Передача информации из QML в заданный экземпляр класса c++
Всем привет. Пытаюсь реализовать следующий алгоритм 1. Имеется QML окно "калькулятор". Для него есть соответствующий класс...

Создание статической функции класса, которая принимает экземпляр этого же класса как объект
Привет. Есть такой код class Model { public: Model(); Model(int verticesSize, int facesSize); ~Model(); static void...

Создать экземпляр одного класса в Main, и передать его в экземпляр другого класса
Добрый день. Подскажите пожалуйста. есть несколько классов-файлов в одном пакете. class one class two class main... Нужно...

9
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
10.11.2009, 19:15
Цитата Сообщение от #pragma Посмотреть сообщение
parser_Init(filename)
функции передаются без параметров. Ты передаешь укзатель на функцию, а не значение функции. Попробуй так:

C++
1
window.pFuncTake(parser_Init,syntax_Check,interp_Run,memory_Free);
1
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
10.11.2009, 19:28  [ТС]
Теперь получаю ошибку такого рода
Code
1
error: no matching function for call to ‘MainWindow::pFuncTake(_char_t*&, void (&)(const _char_t*), void (&)(), void (&)(), void (&)())
но я думаю,это уже связано с неправильным использованием кода самой библиотеки? То есть подключения интерфейсов недостаточно,нужно ещё как-то "подгрузить" код?
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
10.11.2009, 19:33
#pragma, ммм.
посмотри какие параметры в ошибке показывает, и какие передает. Видишь, в ошибке их 5.
1
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
10.11.2009, 19:40  [ТС]
Да,я же везде сменил,их уже 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
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
10.11.2009, 19:58
#pragma, твой класс содержиться в дополнительной библиотеки? Если да - библиотеку подлкючать надо. Если же нет (он в исходниках) тогда не надо никаких библиотек.
1
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
10.11.2009, 20:26  [ТС]
Да,сам класс(реализация) находится в коде библиотеки .so,а я подключаю только интерфейс(.h-файл).Значит,мне нужно пользоваться платформенно зависимыми функциями для подгрузки кода библиотеки? То есть для винды это будут одни функции,для Unix систем -другие?
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
10.11.2009, 23:46
#pragma, мм.. поидеи, раз ты подключил header, то тебе просто нужно стравить библиотеку компилятору. Попробуй просто при компилировании стравить библиотеку компилятору. Ты где пишешь? В средах разработки, это можно в свойствах проекта как правило выставлять. Если же из под командной строки компилируешь - попробуй стравить линкеру. (еси честно, не помню когда травить либу надо.. при линковки, или вместе с другими исходниками )
1
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
11.11.2009, 01:44  [ТС]
Что-то я вообще не понимаю,что происходит.Всё указал,все пути до библиотек,Makefile выглядит в общем виде так:
Code
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
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
Получаю странную ошибку при компиляции в консоли:
Code
1
2
3
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();
   }
   ...

Всё.Больше эта функция нигде не присутствует.Может каким-то образом "откуда-то" компилятор видит старые объектники,чудесным образом где-то сохранившиеся? Но я ничего не менял такого.Чудеса прямо..
0
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
11.11.2009, 04:37  [ТС]
Всё,я разобрался,всё из-за невнимательности,просто у меня инклуды от библиотеки валялись в проекте необновлёнными(я делаю библиотеку в отдельном проекте),и я про них совсем забыл,что они там есть )).Monte-Cristo,спасибо за помощь )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.11.2009, 04:37
Помогаю со студенческими работами здесь

передача функции указателей
Сап, помогите пожалуйста разобраться с передачей указателей функции. Нужно для матрицы A (4×5) определить количество строк, сумма...

Передача указателей в функции
Привет всем. Вообщем изучаю с\с++ по книге Павловской, дошел до динамических структур данных(списки, стеки, очереди...), Вообщем наткнулся...

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

Синтаксис объявления функции, возвращающей экземпляр класса
В общем, появилась необходимость создать функцию, возвращающую экземпляр класса TStrings. В чем сложность? - не знаю как комбинировать...

Передача массивов указателей в качестве параметров функции
Доброго времени суток, не компилится данный код. Ошибка возникает в функции deal(deck, suit, face);. Код полностью скомпипастил из...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru