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

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

10.11.2009, 19:05. Показов 6477. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru