279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
1 | |
Вызов метода класса по его имени в строке08.08.2020, 15:09. Показов 3958. Ответов 16
Метки нет (Все метки)
Приветствую всех. Был у меня разговор с Делфи-разработчиком и он говорит, что в С++ нет RTTI, в отличие от Делфи. Я говорю, как же нет, если об этом куча статей в интернетах! Тогда он сказал: "Как в С++ вызвать метод класса, если его (метода) имя передали в программу в виде текста? В Делфи это делается парой строк кода!"
В связи с этим у меня, собственно, два вопроса: 1. Вызов метода класса описанным выше способом это RTTI или это что-то другое? 2. Возможно ли в "чистом" С++ выполнить вышеуказанную задачу?
0
|
08.08.2020, 15:09 | |
Ответы с готовыми решениями:
16
Вызов класса по его имени Создание объекта класса и вызов его метода Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода Вызов методов классов друг у друга (вызов метода из другого класса) |
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
08.08.2020, 16:55 | 2 |
RTTI не имеет к методам никакого отношения, оно служит для идентификации типов
Нет, ты не можешь получить список методов класса
1
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
09.08.2020, 13:54 | 3 |
Разработчик видимо имел в виду Reflection.
Добавлено через 10 минут Если бы это можно было бы сделать так, как это делается в Delphi, то в С++ пришлось бы хранить информацию о методах в runtime. При дизайне языка от этого намеренно отказались, чтобы не нарушать "zero-overhead principle"
Сообщение от https://www.stroustrup.com/ETAPS-corrected-draft.pdf
http://www.open-std.org/jtc1/s... 16/p0385r0
2
|
369 / 312 / 65
Регистрация: 14.10.2014
Сообщений: 1,319
|
|
09.08.2020, 20:00 | 5 |
Вообще, смотрел как то с годик назад видео, про С++11 кажется, и там было сказано, что попытки прикрутить рефлексию к С++ (наподобие джавишной к примеру) были предприняты. Причем ни кем-нибудь, а самим комитетом по стандартизации языка, но получалось как то "криво, косо и вообще не очень." С++ это про высокую оптимизацию и быстродействие, а в той же джаве, чтоб пользоваться рефлексией, нужно в классе таскать дополнительную инфу про класс. Это доп расходы. К тому же - что джава, что сишарп (в нем тоже вроде как рефлексия есть) - они чисто объектно ориентированные языки. А С++ - нет. Для сомневающихся - попробуйте сделать в той же джаве что - нибудь вообще без классов - это невозможно, а в плюсах - да без проблем.
Добавлено через 6 минут а в чём проблема - передаём название метода через командную строку, сочиняем метод, где разбираем аргументы командной строки, если встретились названия методов, то вызываем их
1
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
11.08.2020, 08:05 [ТС] | 7 |
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
11.08.2020, 10:30 | 8 |
d7d1cd, нужно регистрировать методы руками в каком-то ассоциативном хранилище. Потом можете вызывать по имени.
Автоматически зарегистрировать не получится. Добавлено через 44 секунды Была бы статическая рефлексия - можно было бы на ее основе сделать удобную динамическую.
0
|
11.08.2020, 17:17 | 9 | |||||
Если на коленке то как то так:
1
|
369 / 312 / 65
Регистрация: 14.10.2014
Сообщений: 1,319
|
||||||
11.08.2020, 19:19 | 10 | |||||
Формально - все условия соблюдены
0
|
Avazart
|
11.08.2020, 19:33
#11
|
Не по теме: Recrut_rf, Это был не совсем вопрос ...
0
|
Recrut_rf
|
11.08.2020, 19:43
#12
|
Не по теме:
0
|
11.08.2020, 19:51 | 13 |
Не по теме: Т.е. что же это было глупость или намеренное введение в заблуждение? Или без 5 ржавых никак? По теме: https://coderoad.ru/4186458/De... 0%BA%D0%B5
0
|
Recrut_rf
|
11.08.2020, 19:56
#14
|
Не по теме:
и написал свой ответ, ничего более. Да и дельфист, судя по описанию темы, сам не в курсе, что такое RTTI в С++. Просто я, как скорее всего и вы - знакомы с рефлексией на других языках программирования, поэтому и понимаем, о чём речь идёт. Но вот если бы, к примеру, я никогда бы не писал на Джаве или Сишарпе, то свой ответ (который выше) считал бы абсолютно законным, правильным и истинно верным.
0
|
11.08.2020, 20:05 | 15 |
По ссылке выше понятно что в Delphi под RTTI понимают большее чем в С++.
Но в C++ вопрос с рефлексией подымается часто, при чем как писали выше тут еще и рефлексия разная бывает. Кроме того есть С++Qt и вообще задачи когда такое действительно требуется например при сериализации и GUI. Другое дело то что разработчики других языков называют благом - для С++ программиста - не всегда оправданные расходы. Добавлено через 6 минут Где там было сказано что приложение консольное и вообще про аргументы консоли?
0
|
369 / 312 / 65
Регистрация: 14.10.2014
Сообщений: 1,319
|
|
11.08.2020, 20:16 | 16 |
Не по теме:
Добавлено через 5 минут А там и обратного не сказано. Да и никто не мешает взять строку с названием метода с графического интерфейса, с поля ввода текста к примеру, и провернуть тот же трюк. Какой вопрос - такой и ответ. Но так мы сейчас "засрём" тему своими сообщениями - понятно, что я не прав - нет никакой рефлексии в чистых плюсах. И вывод метода класса по имени этого метода - невозможен.
0
|
11.08.2020, 21:14 | 17 |
Так там и про "Капитал" К.Маркса ничего не сказано почему Вы его не упомянули ?
Добавлено через 2 минуты Конечно обычно через специальный препроцессинг / кодогенерацию и решается проблема. В Delphi думаю есть вероятность что примерно так же решается проблема только все намертво зашито в компилятор/IDE.
0
|
11.08.2020, 21:14 | |
11.08.2020, 21:14 | |
Помогаю со студенческими работами здесь
17
Вызов метода по имени Вызов метода по имени Вызов метода агрегата из метода агрегируемого класса Вызов метода класса из метода другого класса Вызов метода по имени из переменной Вызов метода производного класса через обращение к методу базового класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |