Вот как я справился с проблемой. Код пользователя выглядит так:
class Env
{
public:
Env();
~Env();
private:
void *priv;
};
class MyInterface
{
public:
MyInterface(Env &e) : e(e) { }
int create_A();
void use_A(int a);
private:
Env &e;
void *priv;
};
int main()
{
Env e;
MyInterface i(e);
int a = i.create_A();
use_A(a);
}
Таким образом, каждая зависимость видна в коде пользователя. Зависимости между объектами хорошо хранятся в std :: vectors в классе Env. Индексы к векторам будут возвращены из функций. create_A () и use_A () могут общаться через int. Все объекты будут уничтожены одновременно, когда класс Env выйдет из области видимости. Ваши объекты могут быть производными от базового класса, в котором есть виртуальный деструктор.
Если у вас есть более одного int, рекомендуемый способ:
struct ID { int i; };
Реализация интерфейса будет опираться на следующие функции:
A *find_a(const Env &e, ID i);
ID create_a(Env &e, A *ptr);
Приведенный выше подход решает следующие проблемы с временем жизни объекта:
- время жизни объектов
- зависимости между объектами (через целые числа)
- идентификация объектов
- зависимости могут храниться либо через int, либо через указатели
- уничтожение объектов по окончании жизни