これが私が問題を処理した方法です。ユーザーコードは次のようになります。
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);
}
このようにして、すべての依存関係がユーザーコードに表示されます。オブジェクト間の依存関係は、Envクラスのstd::vectors内に適切に保存されます。ベクトルへのインデックスは関数から返されます。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経由)
- オブジェクトの識別
- 依存関係は、intまたはポインターを介して格納できます。
- 寿命が終わったときにオブジェクトを破壊する