Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
Заблокирован

Можно ли в рантайме получить список функций - членов класса?

13.11.2014, 10:54. Показов 3375. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Допустим:
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
class BASE
{
public:
    BASE();
    ~BASE();
 
private:
    void VoidFunc();
    bool BoolFunc();
    int IntFunc();
 
/*В стиле Qt:
signals:
    void VoidFunc();
    bool BoolFunc();
    int IntFunc();
*/
 
/*В собственном стиле:
tracking_functions:
    void VoidFunc();
    bool BoolFunc();
    int IntFunc();
*/
};
Есть ли способ получения по указателю на экземпляр класса его списка имён функций, их аргументов и возвращаемых значений. Ну допустим всех его функций? Или же части функций, который только private ? А может можно как - то в стиле Qt сделать свои директивы типа signals / slots, чтоб внутри их как - то писать функции, доступ к которым предполагается получить в рантайме?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.11.2014, 10:54
Ответы с готовыми решениями:

Можно ли получить список функций из DLL, не имея .lib или .h файла?
Или другими словами, можно ли позаимствовать библиотеку, находящуюся рядом с установленной программой?

Передача функций обратного вызова как членов некоторого класса
Пытаюсь понемногу изучать OpenGL, и вот сейчас столкнулся с такой проблемой: Имеется некоторый класс, содержащий вектор и пару...

Можно ли как-то получить из одного класса исходный код другого класса?
Предположим есть два публичных класса. Один находится в одной части проекта, другой где-нибудь в другой части проекта. Мне для своих...

14
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
13.11.2014, 11:03
-THE_MASTER666-, чувамк, ты языком ошибся. Это не интерпретируемая скриптота и не байт-код, выполняемый на виртуалке. С++ нативный язык.

Не по теме:

Регистрация: 13.10.2014
Почему мне кажется, что ты на форуме гораздо дольше?

0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
13.11.2014, 11:06
C++
1
void (BASE::*p)() = &BASE::VoidFunc;
только такая идея...

Добавлено через 1 минуту
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Есть ли способ получения по указателю на экземпляр класса его списка имён функций, их аргументов и возвращаемых значений. Ну допустим всех его функций? Или же части функций, который только private ? А может можно как - то в стиле Qt сделать свои директивы типа signals / slots, чтоб внутри их как - то писать функции, доступ к которым предполагается получить в рантайме?
лучше напишите какое желаете результат, а НЕ свои мысли по этому поводу, тогда Вам помогут
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
13.11.2014, 11:07
-THE_MASTER666-, У Qt своя мета-система, поэтому там это возможно. В стандартном С++ нет.
0
Заблокирован
13.11.2014, 11:13  [ТС]

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Почему мне кажется, что ты на форуме гораздо дольше?
всё может быть :D


Цитата Сообщение от ForEveR Посмотреть сообщение
У Qt своя мета-система, поэтому там это возможно. В стандартном С++ нет.
Ну в общем тут без галимого мета программирования не обойтись ?
Цитата Сообщение от aLarman Посмотреть сообщение
только такая идея...
Ну и как это поможет мне допустим имя функции?
На этапе сборки проекта всю эту лабуду с пол пинка узнать можно, ну по - крайней мере в VS, всякими препроцессорными штуковинами типа: __FUNCTION__, __FUNCDNAME__ и т.д., а вот в рантайме хз как это сделать...
Ну нет - так нет, проехали
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
13.11.2014, 11:14
Лучший ответ Сообщение было отмечено -THE_MASTER666- как решение

Решение

-THE_MASTER666-, С чего бы это мета-программирование галимое? Потому что вы его не понимаете? В общем и целом нет, не обойтись. Про MOC в Qt - http://qt-project.org/doc/qt-4.8/moc.html
2
Заблокирован
13.11.2014, 11:19  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
С чего бы это мета-программирование галимое?
Не люблю всякие генераторы дополнительного и необходимого для работы кода
Ладно, понял, в мета муть лезть не буду, поменяю стратегию разработки лучше . Спасибо.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
13.11.2014, 12:20
Я почти уверен, что необходимость в такой экзотике не очень нужна и проблема лишь в проектировании.
Это как получение указателя на таблицу виртуальных функция для ручного каста её в другую таблицу.

Лучше опишите проблему, наверняка есть методы решения получше.
3
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
13.11.2014, 12:44
Можно сделать мега костыль, обмотанный кровавыми бинтами, в виде макроса, который будет применяться для определения класса, который будет для каждого метода делать метод, возвращающий его имя/сигнатуру в виде строки. Но это жесть конечно.
0
Заблокирован
13.11.2014, 12:59  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Лучше опишите проблему, наверняка есть методы решения получше.
На самом деле проблема несколько в другом.
В общем попытайтесь уловить мысль.
В упрощённом варианте: есть блок - схема - архитектура системы, на этой блок схеме есть прямоугольнички - отдельные объекты архитектуры, в каждом объекте есть входящие и исходящие слоты для обмена данными между объектами архитектуры. Каждый входящий и исходящий слот типизирован...
Каждый прямоугольник включает в себя его название, ну там описание id ещё кое что и в том числе возможные варианты типов данных, с которыми он работает...
[Документ]
....
[Набор операционных типов данных 1] = (этот набор в виде строки описания семантики) [INT, FLOAT, DOUBLE]
[Набор операционных типов данных 2] = (этот набор в виде строки описания семантики) [CHAR*, CHAR*, INT]
и тд

Хмм...как бы объяснить то....

То есть каждый объект документа имеет список вариантов наборов данных, которые могут представлять этот объект... Ну вот ещё пример:

[Документ : "Целое число 1"]
[Набор операционных типов данных 1] = [INT]

[Документ : "Целое число 2"]
[Набор операционных типов данных 1] = [INT]

[Документ : "Очень хитрое перемножение двух целых чисел"]
[Набор операционных типов данных 1] = [INT] (тут INT - это результат)

В общем эту блок схему допустим я рисую в каком то своём графическом редакторе и сохраняю её в файл.

Да не суть... Короче, тут надо вот что...
Разрисовал я огромную блок схему архитектуры системы, к которой есть куча прямоугольничков, которые принимают на вход какие - то данные и испускают на выход другие. Всё остальное и прочие нюансы обсуждать не будет - очень долго.
Суть в том, что теперь я хочу нагрузить свою группу программистов работой.
Как? А просто, я каждому программисту даю по прямоугольничку, код которого он должен будет написать.
На самом деле там всё не так и на много сложнее, тут просто для простоты так описываю.
Так вот, каким бы макаром сделать этот процесс безопасным и автоматизированным в том плане, чтоб программист получил на вход именно то, что я напроектировал в своей системе?
То есть по хорошему... Стоп, ещё упростим: мне надо из работающей 24/7 системы, которая периодический свопит свою конфигурацию на хард давать задания программистам на разработку кода определённых новых объектов системы, допустим эти объекты вообще являются простыми функциями, у которых есть список аргументов и возвращаемое значение.
В системе у меня эта функция из предыдущего упрощения является прямоугольником с входящими слотами и одним исходящим. Какие типы переменных идут на вход и на выход (слоты в упрощение) у меня записано в текстовом виде.
Теперь главный вопрос, как мне дать программисту задание на написание функции, чтоб он как в случае с чисто виртуальной функцией был обязан её написать и именно с теми аргументами и возвращаемым значение, которые у меня в системе в текстовом виде?
Полагаю, что тут нужно автоматом генерить код абстрактного класса с необходимой функцией, добавлять его в колекциою файлов системы и говорить программисту, чтоб он наследовался от него и писал код... Так?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
13.11.2014, 13:09
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Полагаю, что тут нужно автоматом генерить код абстрактного класса с необходимой функцией, добавлять его в колекциою файлов системы и говорить программисту, чтоб он наследовался от него и писал код...
1. Не смешивать проектирование и реализацию системы.
2. Не автоматизировать то, что автоматизируется плохо.
3. Отказаться от сложных процессов в пользу простых.
1
Заблокирован
13.11.2014, 13:15  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
1. Не смешивать проектирование и реализацию системы.
В классических системах этот совет имеет право на жизнь. Но только не в моей системе совершенного нового типа и стиля программирования. Тут как бы система и есть сама система и её архитектура и то что она выполняет и в рантайме тд. (вся система - огромная нейронная самодостаточная сеть). Сейчас чешу репу и танцую с бубном во круг С++... Как бы это всё положить на язык ...
Цитата Сообщение от 0x10 Посмотреть сообщение
Не автоматизировать то, что автоматизируется плохо.
Таких вещей попросту нет, стоит лишь под другим ракурсом на них взглянуть
Цитата Сообщение от 0x10 Посмотреть сообщение
Отказаться от сложных процессов в пользу простых.
Это верно, но только лишь в том случае, если эти простые процессы не скуют систему жёсткими ограничениями, иначе всё пропало.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
13.11.2014, 13:22
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Полагаю, что тут нужно автоматом генерить код абстрактного класса с необходимой функцией, добавлять его в колекциою файлов системы и говорить программисту, чтоб он наследовался от него и писал код... Так?
Если вам нужно просто проверить соответствует функция сигнатуре или нет, можете распарсить примитивной регуляркой.
Хотя я не представляю зачем всё это нужно на деле. Легче написать юнит тесты и заставить систему проходить их, проверяя соответствует ли функция своему логическому содержанию, а не оценивая её поверхностно (читать TDD). Можно написать тесты, подставляющие с помощью макросов в реализованном классе наследование от примитивного абстрактного и пробовать создать объект.
Всё равно я не до конца уловил суть проблемы, зачем нужно проверять сигнатуру, в то время, как функция может быть всего-лишь пустышкой.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
13.11.2014, 13:26
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Есть ли способ получения по указателю на экземпляр класса его списка имён функций, их аргументов и возвращаемых значений. Ну допустим всех его функций? Или же части функций, который только private ?
В COM такое возможно, там нужная информация хранится в библиотеке типов и
может извлекаться динамически. В частности, IDispatch так работает, а на нем
построены JScript/VBScript в Windows и еще куча других компонентов.

Не по теме:


Цитата Сообщение от Kastaneda Посмотреть сообщение
Можно сделать мега костыль, обмотанный кровавыми бинтами, в виде макроса, который будет применяться для определения класса, который будет для каждого метода делать метод, возвращающий его имя/сигнатуру в виде строки.
:D

1
Заблокирован
13.11.2014, 13:35  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Если вам нужно просто проверить соответствует функция сигнатуре
Не совсем так. Сигнатура функции - второстепенна, тут более важен семантический смысл данной сигнатуры.
Вот пример:

[Два числа для умножения]
[INT - первое число]
[INT - второе число]
или
[INT - второе число]
[INT - первое число]
или
[FLOAT - второе число]
[INT - первое число]

То есть набор самих типов данных - это так, для совместимости с С++ )))))))
Главное это [Два числа для умножения], то есть именно это и является типом данных.
В моём случае это и есть некоторый прямоугольник.

минутку . сейчас в пэйнте нарисую
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.11.2014, 13:35
Помогаю со студенческими работами здесь

Как получить имена членов класса с помощью рефлексии
Как получить имена членов класса с помощью рефлексии?

Просмотреть список функций и процедур класса (модуля)
Как в Visual Studio увидеть список всех объявленных, существующих функций и процедур класса? Например, как это реализовано в 1С, очень...

Можно ли понизить уровень доступа членов класса при его наследовании?
Можно ли в С# понизить уровень доступа членов класса при его наследовании? В плюсах подобное решала семантикой наследования. Т.е. при...

Получить список функций из DLL
Подскажите, пожалуйста, как можно программно получить список названий функций из самого DLL-файла? Ну или хотя бы адреса функций. Пока...

Как получить доступ к членам класса из функций
Есть код типа //***************************************************************************** func1() { body; } func2() ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru