crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Скрытие некоторых методов класса для отдельных dll
MishaUA
  опции профиля:
сообщение 9.7.2015, 7:58
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 184
Регистрация: 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


Профессионал
*****

Группа: Модератор
Сообщений: 1571
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 218 раз(а)




Репутация:   12  


для класса так не получится. нельзя собрать класс "частично". он экспортируется целиком. можно написать какой-то другой класс, который будет скрывать некоторые методы, и передавать его. или написать функцию-прокси для вызова метода и передавать указатель на функцию.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 9.7.2015, 11:26
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 184
Регистрация: 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


Профессионал
*****

Группа: Модератор
Сообщений: 1571
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 218 раз(а)




Репутация:   12  


Цитата(MishaUA @ 9.7.2015, 13:26) *
Но почему? В этом видео https://www.youtube.com/watch?v=TNNaEY5WPAM сказано, что имена методов класса и типы+количество их параметров хранятся в текстовом виде.
Я попытался сделать так, как написал выше - всё работает. Подскажите, плиз, где я ошибаюсь?

я на работе, видео мне смотреть некогда. но внутреннее представление и экспорт классов - это не экспорт функций, это совсем другая вещь и он не декларируется стандартом. так что каждый компилятор по-своему с ума сходит реализует свой алгоритм экспорта и имеет свои правила именования и связывания для классов и их методов. и тут всё зависит от компилятора или даже версии компилятора (например, старые версии MSVC не совместимы с новыми в этом плане). ну и много разных прочих тонкостей, в которые лучше не погружаться, если это не случай крайней необходимости.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 9.7.2015, 12:43
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 184
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Цитата(lanz @ 9.7.2015, 11:59) *
Возможные проблемы хорошо описаны вот здесь:
http://holtstrom.com/michael/blog/post/437...-Conflicts.html

На сколько понял, тут описана проблема при которой одна функция вызывает другую, которая может не существовать, но при этом вроде, мне кажется, компилятор выдаст ошибку.

Приведу пример:

class class1 {
#ifdef USE_MEHOD1
    void method1() {};
#enfid        
    void method2() {};
};

Класс, который находится в библиотеке:
class classOfLIb {
    void classOfLIb(class1 *obj) {
        obj->method2();    // вызываем method2. method1 никогда в этом классе вызываться не будет
    }
};

Примерное содержимое проги:
#define USE_MEHOD1
void main() {
    class1    *obj = new class1();
    obj->method1();
    obj->method2();
    
    classOfLIb    *col = библиотекозагружалка(obj) // вызываем какую-то функцию, которая загрузит библиотеку, сишная функция библиотеки создат объект класса classOfLIb и передаст ей указатель на obj
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 9.7.2015, 13:04
Сообщение #7


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


class1.cpp входит и в библиотеку?
Если нет, то никакого смысла ifdef не несет. Библиотеке все равно какие методы есть у класса, пока тела этих методов лежат где то в другом месте.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 9.7.2015, 13:17
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 184
Регистрация: 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 вместе с библиотекой.
Достаточно подключить заголовочный файл.
Неважно кто создает объект, важно где хранится код этого метода.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.9.2018, 6:32