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".

Кто-нибудь знает способ скрыть включение Bh? Для решений C++11 - это нормально, но привязка к дополнительным зависимостям (например, boost) не возможна.

2 ответа

Решение

Один из нормальных способов скрыть "реализацию" в мире 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;
};
Другие вопросы по тегам