2013-10-15 2 views
1

Я пишу общую библиотеку (назовите ее MyLib), которая зависит от другой библиотеки (назовите ее ParentLib). В ParentLib есть несколько виртуальных функций, которые я реализую в MyLib вместе с несколькими другими независимыми реализациями.Скрытие включает родительскую библиотеку

// MyLib.h 
#include <parentlib_library.h> 

class Foo : public ClassinParent 
{ 
    public: 
     void DefinitionofParentLibFunction(); 
    private: 
     // ...  
}; 

Я был в состоянии собрать и генерировать MyLib без каких-либо проблем, но когда MyLib используется приложением, мне нужно включить ParentLib_library.h для компиляции кода. Одним из моих требований является то, что ParentLib должен быть полностью скрыт от приложения. Я не уверен в следующем шаге для достижения этого. Любые идеи?

ответ

1

Если ваше объявление используется в обратном вызове или реализации интерфейса из 3dparty lib - тогда нет способа. Во всех других случаях я обычно применяю следующие 3 подхода.

1) Использовать агрегацию. Объявить ClassInParent, как вперед и использовать в качестве члена Foo:

class ClassInParent;//forward declare 
class Foo 
{ 
    ClassInParent* _inst; //use either pointer of reference to external 
public: 
    void method_of_ClassInParent() //make facade for parent methods if needed 
} 

2) Разделить класс на интерфейс (который не зависит от ClassInParent) и реализации (что не подвергать через #include)

Ваш Foo. ч:

class Foo 
{ 
public: 
    virtual void do_smth() = 0; 
}; 

Ваш foo.cpp:

#include <parentlib_library.h> 
class FooImpl : public Foo, public ClassInParent 
{ 
    void do_smth() 
    {//implementation 

3) Используйте шаблоны. Вместо явного шаблона используйте inherience:

template <class T> 
class Foo : public T 
{ 

Позже в коде Foo<ClassInParent>

Смежные вопросы