наследование — C ++ скрывает унаследованный класс?

Я пытаюсь скрыть включение стороннего файла в заголовок основного класса в библиотеке, которую я написал, из исполняемых файлов, которые его связывают. Я имею в виду:

У меня есть библиотека, которую я написал, которая определяет класс 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) не возможна.

3

Решение

Один из нормальных способов скрыть «реализацию» в мире 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();
}
3

Другие решения

Способ использования непрозрачных указателей состоит в том, чтобы заранее объявить классы, которые вам нужно использовать, чтобы вам не нужно было include их определения. Поскольку вы не включаете B.h клиенты вашей библиотеки не будут загрязнены их определениями.

// In A.h
class B;

class A
{
private:
B* opaque;
};
3

По вопросам рекламы [email protected]