私はこのような構造体を持っています:
struct foo
{
IBar* ptr;
};
これは、有効期間が長い foo オブジェクトの一部です。ユーザーは、さまざまなコールバックでこれらのオブジェクトのインスタンスを取得することが多く、特定の場所で IBar* に何かを挿入し、後のコールバックで使用して、最終的に解放します。(IBar にはvirtual void free() { delete this; }
もちろんオーバーライド可能なものがあります)。
問題は、foo 構造体ごとに複数のユーザーを持つ可能性にユーザーを移行しIBar*
、移行をスムーズにしたいことです。移行をスムーズにするための 1 つのアイデアは、次のように foo 構造体を変更することです。
struct foo
{
foo()
{
ptr = reinterpret_cast<IBar*>(new IBar*[N]);
memset(ptr, 0, sizeof(IBar*)*N);
}
IBar*& getBarPtr(size_t offset)
{
return reinterpret_cast<IBar**>(ptr)[offset];
}
IBar* ptr;
};
私の考えでは、このように、1 つしかないと予想される古いスタイルを使用している人は、通常の使用方法で透過的にIBar*
最初のものを使用することにフォールバックする必要があります。N
someFoo.ptr = new iImplementIBar(...);
しかし、新しい使用法に移行し始めたユーザーは、オフセットを取得して代わりに使用することができます
someFoo.getBarPtr(myOffset) = new iImplementIBar(...);
ただし、問題は、これを行うために使用されるメソッドがfoo
あったことです。reset
void reset() {
if (ptr)
{
ptr->free();
ptr = 0;
}
}
このアイデアはこれに置き換えられます:
void reset() {
IBar** ptrs = reinterpret_cast<IBar*>(ptr);
for (size_t i = 0; i < N; ++i)
if (ptrs[i])
{
ptrs[i]->free();
ptrs[i] = 0;
}
}
上記の の機能はfree
失われているようです。これを機能させる方法はありますか?または何がうまくいかないのですか?