Основание на Eric Finn's answer, вы можете просто объявить interface
класс для хранения всех ваших публичных методов, которые считаются вашим API, и скрыть все реализации и частные член/методы в классе реализации, который наследует interface
класса, вот пример:
Ваш заголовочный файл: my_api.h
// your API in header file
// my_api.h
class interface {
public:
static interface* CreateInstance();
virtual void draw() = 0;
virtual void set(int) = 0;
};
ваша реализация (разделяемая библиотека): my_api.cpp (пользователи не будут видеть это, когда вы сделаете это разделяемая библиотека) Таким образом, вы можете скрыть все ваши реализации и приват т.е методы/члены здесь
#include "my_api.h"
// implementation -> in .cc file
class implementation : public interface {
int private_int_;
void ReportValue_();
public:
implementation();
void draw();
void set(int new_int);
};
implementation::implementation() {
// your actual constructor goes here
}
void implementation::draw() {
cout << "Implementation class draws something" << endl;
ReportValue_();
}
void implementation::ReportValue_() {
cout << "Private value is: " << private_int_ << endl;
}
void implementation::set(int new_int) {
private_int_ = new_int;
}
interface* interface::CreateInstance() {
return new implementation;
}
Как пользователь использует свой API:
#include <iostream>
#include "my_api.h"
int main(int argc, const char * argv[])
{
using namespace std;
interface* a; interface* b;
a = interface::CreateInstance();
a->set(1);
b = interface::CreateInstance();
b->set(2);
b->draw();
a->draw();
return 0;
}
Выход:
Implementation class draws
Private int is: 2
Implementation class draws
Private int is: 1
В этой схеме, ваша апи просто абстрактный класс, который работает как фабрика , вы также можете реализовать виртуальный метод в разных классах и указать, какой экземпляр вы хотите вызвать.
Похоже, вы можете использовать идиом Pimpl. Но какой бы метод вы ни использовали в конце, вам нужно знать, что скрытие реализации может привести к проблемам с производительностью (компилятор не сможет вставить много строк). – syam