API дизайн в C ++ - PullRequest
       15

API дизайн в C ++

1 голос
/ 08 марта 2012

Начинаю писать сложную часть программного обеспечения на C ++, в которой используются несколько других библиотек, и сейчас меня беспокоит то, что я хочу, чтобы только ограниченное число классов имело доступ к этим библиотекам, но с заголовками C ++ и объектом, который включает в себязаголовок также должен получить доступ к зависимостям классов.Как лучше всего обойти это?

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Одним из предложений будет использование либо шаблонов pimpl, либо абстрактных «интерфейсов».

Шаблон pimpl - это место, где вы храните указатель на объявленный вперед класс реализации.

Пример:


blah.hpp

class foo
{
    struct impl;
    impl* myImpl;
public:
    foo();
}

blah.cpp

#incldue <internalClass>
struct foo::impl
{
    internalClass o;
};

foo::foo()
{
   myImpl = new impl();
}

Другой вариант - иметь чистый виртуальный абстрактный класс (AKA-интерфейс). Затем у вас есть фабричная функция (или фабричный класс), возвращающая указатель на вашу реализацию. Таким образом, клиентский код никогда не должен видеть членов внутри вашей реализации.

Пример:


inter.hpp

class inter
{
   virtual void doFoo() = 0;
   inter* create();
};

realInter.hpp

class realInter: public inter
{
   virtual void doFoo() { //blah blah blah}
   internalClass aMember;
};

inter.cpp

#include <realInter.hpp>
inter* inter::create()
{
   return new realInter();
}
0 голосов
/ 08 марта 2012

Если объекты из вашей библиотеки содержат только указатели или ссылки на объекты из библиотеки с ограничением , вы можете объявить их в заголовке, а не включать сами заголовки.Например, вы можете сделать это

class restricted_lib_class1;
class restricted_lib_class2;

class my_class1 {
    restricted_lib_class1 *restricted1;
    restricted_lib_class2 *restricted2;
    // Other class members
};

вместо этого:

#include <restricted.h> // contains definitions of restricted_lib_class1 and restricted_lib_class2

class my_class1 {
    restricted_lib_class1 *restricted1;
    restricted_lib_class2 *restricted2;
    // Other class members
};

В случае с прямыми декларациями только файл CPP должен включать заголовок restricted.h.

Конечно, если вы должны включить экземпляры «ограниченных» классов или наследовать их, у вас нет возможности включить их заголовки в заголовочные файлы.

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