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

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

10.11.2009, 19:05. Показов 6435. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru