Я не уверен, возможно ли это вообще, но здесь идет речь:
У меня есть библиотека, интерфейс которой, в лучшем случае, сложен. К сожалению, это не только сторонняя библиотека (и слишком большая, чтобы ее переписать), я использую несколько других библиотек, которые зависят от нее. Так что интерфейс должен оставаться таким, какой он есть.
Чтобы решить эту проблему, я пытаюсь по существу обернуть интерфейс и объединить все интерфейсы зависимостей в меньшее количество логических классов. Эта часть идет хорошо и прекрасно работает. Большинство классов-оболочек содержат указатель на объект одного из исходных классов. Вот так:
class Node
{
public:
String GetName()
{
return this->llNode->getNodeName();
}
private:
OverlyComplicatedNodeClass * llNode; // low-level node
};
Моя единственная проблема - это второстепенный вопрос. Помимо упрощения интерфейса, я бы хотел убрать требование связывания с исходными заголовками / библиотеками.
Это первая трудность. Как я могу обернуть классы таким образом, что нет необходимости включать оригинальные заголовки? Оболочка будет построена как разделяемая библиотека (dll / so), если это делает ее проще.
Исходные классы являются указателями и не используются ни в каких экспортируемых функциях (хотя они используются в нескольких конструкторах).
Я поиграл с несколькими идеями, в том числе с препроцессором:
#ifdef ACCESSLOWLEVEL
# define LLPtr(n) n *
#else
# define LLPtr(n) void *
#endif
Что в лучшем случае ужасно. Он делает то, что мне нужно в принципе, но я бы предпочел реальное решение такого рода беспорядка.
Некоторая магия типа указателя работает, пока я не наткнулся на несколько функций, использующих общие указатели (некоторый пользовательский класс SharedPtr<>
, обеспечивающий подсчет ссылок) и, что еще хуже, несколько специфических для класса общих указателей, полученных из базовый SharedPtr
класс (NodePtr
, например).
Можно ли вообще обернуть оригинальную библиотеку таким образом, чтобы для ссылки на мою динамическую библиотеку требовалось включать только мои заголовки? Нет необходимости ссылаться на исходную библиотеку или вызови функции из него, только мои. Единственная проблема, с которой я сталкиваюсь - это используемые типы / классы.
Вопрос может быть не совсем понятным. Я могу попытаться очистить его и добавить больше примеров кода, если это поможет. Я не очень беспокоюсь о каких-либо затратах на производительность или об этом методе, просто сначала пытаюсь заставить его работать (преждевременная оптимизация и все такое).