Я пытаюсь скрыть включение стороннего файла в заголовок основного класса в библиотеке, которую я написал, из исполняемых файлов, которые его связывают. Я имею в виду:
У меня есть библиотека, которую я написал, которая определяет класс A. Класс A наследуется от класса B (который определен в сторонней библиотеке).
Пример:
// In A.h
#include “B.h”
class A : public B
{
A* something(A* val);
}
// In A.cpp
A* A::something(A*val)
{
// Do something
return val;
}
Заголовочный файл для класса B вносит некоторые изменения в среду, которые идеально подходят для моей библиотеки, но вредны для любого исполняемого файла, связывающего мою библиотеку. Кто-то указал мне на непрозрачные указатели как на потенциальное решение, хотя я не могу понять, как я мог бы использовать их, чтобы скрыть «B».
Кто-нибудь знает способ скрыть включение B.h? Для решений C ++ 11 — это нормально, но привязка к дополнительным зависимостям (например, boost) не возможна.
Один из нормальных способов скрыть «реализацию» в мире C ++ — это идиома Pimpl / Handle-body / bridge.
Вместо того, чтобы предоставлять свой класс A пользователю вашего API, создайте класс-дескриптор, который предоставляет только то, что вы хотите:
В А.ч
class AImpl; // forward declaration
class A {
private:
AImpl* impl;
public:
foo();
bar();
}
Затем поместите вашу фактическую реализацию в другой файл:
AImpl.h
#include <B.h>
class AImpl: public B {
private:
public:
foo();
bar();
somethingThatYouDontWantToExpose();
}
Способ использования непрозрачных указателей состоит в том, чтобы заранее объявить классы, которые вам нужно использовать, чтобы вам не нужно было include
их определения. Поскольку вы не включаете B.h
клиенты вашей библиотеки не будут загрязнены их определениями.
// In A.h
class B;
class A
{
private:
B* opaque;
};