Скрытие некоторых методов класса для отдельных dll |
Здравствуйте, гость ( Вход | Регистрация )
Скрытие некоторых методов класса для отдельных dll |
MishaUA |
9.7.2015, 7:58
Сообщение
#1
|
Участник Группа: Участник Сообщений: 185 Регистрация: 28.4.2013 Пользователь №: 3810 Спасибо сказали: 13 раз(а) Репутация: 0 |
Доброго времени суток!
Есть программа, состоящая с exe и динамических библиотек, которые могут подгружаться по время работы проги. Есть некий класс, который, содержит, допустим, метод1 и метод2, программа создает объект этого класса и может вызывать эти 2 метода. При загрузке библиотеки, прога передает ей указатель на этот же объект, но она может вызывать только метод2, метод1 библиотека никогда вызывать не будет. Интересует, могу ли я через ifdef скрыть метод1 для библиотеки на этапе её сборки? Просто часто в методе1 есть элементы работы с чем-то типа multimedia или scripts, их тогда, во первых, нужно подключать в pro, а во вторых, либа долго собирается. На сколько знаю, в скомпилированном файле методы записаны в текстовом виде, и если их там не будет, то это никак не повлияет на работу проги/библиотеки, если он не вызываются, но чтобы не накосячить, решил уточнить. |
|
|
Iron Bug |
9.7.2015, 11:15
Сообщение
#2
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
для класса так не получится. нельзя собрать класс "частично". он экспортируется целиком. можно написать какой-то другой класс, который будет скрывать некоторые методы, и передавать его. или написать функцию-прокси для вызова метода и передавать указатель на функцию.
|
|
|
MishaUA |
9.7.2015, 11:26
Сообщение
#3
|
Участник Группа: Участник Сообщений: 185 Регистрация: 28.4.2013 Пользователь №: 3810 Спасибо сказали: 13 раз(а) Репутация: 0 |
Но почему? В этом видео https://www.youtube.com/watch?v=TNNaEY5WPAM сказано, что имена методов класса и типы+количество их параметров хранятся в текстовом виде.
Я попытался сделать так, как написал выше - всё работает. Подскажите, плиз, где я ошибаюсь? |
|
|
lanz |
9.7.2015, 11:59
Сообщение
#4
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Если я все правильно понял, то вы компилируете один и тот же класс два раза -
один раз для исполняемого файла и один раз для библиотеки Возможные проблемы хорошо описаны вот здесь: http://holtstrom.com/michael/blog/post/437...-Conflicts.html Я бы определился с местом хранения класса, или сделал бы два разных класса, лишь один из которых содержится в библиотеке(и только в библиотеке). Сообщение отредактировал lanz - 9.7.2015, 12:00 |
|
|
Iron Bug |
9.7.2015, 12:28
Сообщение
#5
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Но почему? В этом видео https://www.youtube.com/watch?v=TNNaEY5WPAM сказано, что имена методов класса и типы+количество их параметров хранятся в текстовом виде. Я попытался сделать так, как написал выше - всё работает. Подскажите, плиз, где я ошибаюсь? я на работе, видео мне смотреть некогда. но внутреннее представление и экспорт классов - это не экспорт функций, это совсем другая вещь и он не декларируется стандартом. так что каждый компилятор |
|
|
MishaUA |
9.7.2015, 12:43
Сообщение
#6
|
Участник Группа: Участник Сообщений: 185 Регистрация: 28.4.2013 Пользователь №: 3810 Спасибо сказали: 13 раз(а) Репутация: 0 |
Возможные проблемы хорошо описаны вот здесь: http://holtstrom.com/michael/blog/post/437...-Conflicts.html На сколько понял, тут описана проблема при которой одна функция вызывает другую, которая может не существовать, но при этом вроде, мне кажется, компилятор выдаст ошибку. Приведу пример:
Класс, который находится в библиотеке:
Примерное содержимое проги:
|
|
|
lanz |
9.7.2015, 13:04
Сообщение
#7
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
class1.cpp входит и в библиотеку?
Если нет, то никакого смысла ifdef не несет. Библиотеке все равно какие методы есть у класса, пока тела этих методов лежат где то в другом месте. |
|
|
MishaUA |
9.7.2015, 13:17
Сообщение
#8
|
Участник Группа: Участник Сообщений: 185 Регистрация: 28.4.2013 Пользователь №: 3810 Спасибо сказали: 13 раз(а) Репутация: 0 |
class1.cpp входит в библиотеку (в первом примере вызывается method2), но объкт этого класса создает (new) прога а в библиотеку передает указатель на этот объект.
|
|
|
lanz |
9.7.2015, 13:26
Сообщение
#9
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Для того чтобы вызвать method2, необязательно компилировать class1.cpp вместе с библиотекой.
Достаточно подключить заголовочный файл. Неважно кто создает объект, важно где хранится код этого метода. |
|
|
Текстовая версия | Сейчас: 29.3.2024, 1:14 |