Не нужно экспортировать класс только с виртуальными / встроенными функциями? - PullRequest
5 голосов
/ 15 февраля 2009

В C ++ на Win32:

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

Правильно ли я считаю, что нет необходимости помечать этот класс как экспортируемый с помощью __declspec, если кто-то собирается вызывать виртуальные или встроенные функции в его экземплярах?

И наоборот, необходимо ли экспортировать объявление класса, если вы хотите вызывать не виртуальные функции-члены?

Ответы [ 4 ]

7 голосов
/ 15 февраля 2009

Правильно ли я считаю, что нет необходимости помечать этот класс как экспортируемый с помощью __declspec, если нужно только вызывать виртуальные или встроенные функции в его экземплярах?

Да, это правильно, и это то, что делает COM, DLL использует только 4 метода, один из которых возвращается к фабрике классов, все члены которой являются чисто виртуальными функциями.

И наоборот, необходимо ли экспортировать объявление класса, если вы хотите вызывать статически определенные функции-члены?

Нет, просто экспортируйте статические функции-члены.

1 голос
/ 11 ноября 2009

C ++ искажение имен служит бременем для успеха написания кросс-компиляторных модулей, просто объявите класс, который вы хотите представить, как интерфейс, содержащий только виртуальные функции. Компоновка класса с виртуальными функциями может быть «стандартизирована», подумайте о COM.

1 голос
/ 15 февраля 2009

Правильно ли я верю ...

Да, я так думаю, но:

  • Вы должны проверить это (я не могу в настоящее время)

  • Возможно, вы захотите остерегаться, используя встроенные методы: потому что, если вы измените их позже, вам следует перестроить каждый другой компонент, который зависит (был создан с) от этого класса (то есть DLL больше не работает встроенные или автономные ... встроенные методы в пределах одной библиотеки работают нормально, но при использовании в экспортированном интерфейсе библиотеки DLL это своего рода «адский DLL»).

И наоборот, необходимо ли экспортировать объявление класса, если вы хотите вызывать статически определенные функции-члены?

Если не весь класс, вам необходимо экспортировать хотя бы эти отдельные статические методы.

1 голос
/ 15 февраля 2009

Нет необходимости, только если функция / класс имеют все свое определение в заголовочном файле. Это не зависит от виртуальности.

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

Вы также можете объявить экспортируемые только определенные функции-члены вместо всего класса, используя __declspec в объявлении функции, а не в объявлении имени класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...