我有一个这样的结构:
struct foo
{
IBar* ptr;
};
它是具有较长生命周期的 foo 对象的一部分。用户经常在不同的回调中获取这些对象的实例,有时他们在某些地方将东西注入 IBar*,在以后的回调中使用它,最终释放它。(IBarvirtual void free() { delete this; }
当然可以被覆盖)。
问题是我想将我的用户转换为每个 foo 结构拥有多个的可能性,IBar*
并且我想让转换顺利进行。使过渡平滑的一个想法是更改 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;
};
我的想法是,通过这种方式,任何使用旧样式的人都应该以通常的使用方式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
上面的功能似乎丢失了。有没有办法使这项工作?或者出了什么问题?