C++ 纯虚拟类(接口)和继承它的对象的内部数组分配
我不确定我的想法是否可行,这就是我想要实现的目标:C++ 纯虚拟类(接口)和继承它的对象的内部数组分配,c++,arrays,class,pure-virtual,C++,Arrays,Class,Pure Virtual,我不确定我的想法是否可行,这就是我想要实现的目标: > p>我正在开发一个C++库,它将被其他开发人员(客户端)使用。 库应该公开只包含接口类(纯虚拟类)的头。没有别的了 开发人员将从公开的标题调用函数来分配对象(例如刚体)并释放它们 我希望有一个函数可以返回对象的经典数组(使用new[]),而不是链表或使用std:: 下面是它的样子: // exposed header (this is what developer will see) // interface class class s
// exposed header (this is what developer will see)
// interface class
class someInterface
{
public:
virtual void function1(void) = 0;
};
// public API to initialize array of objects and release it
someInterface *NewSomeClassArray(unsigned int num);
void ReleaseSomeClassArray(someInterface**a);
及
所以,当开发人员将库链接到他的项目中并包含标题时,他会执行以下操作:
someInterface *test = NewSomeClassArray(2);
test[0].function1();
test[1].function1();
ReleaseSomeClassArray(&test);
但是,当访问测试[1](在iOS项目中的XCode上测试)时,上述操作会产生运行时冲突
对我来说,这听起来是合乎逻辑的,因为“someInterface”的大小不同于“someClass”(someClass更大),所以偏移量[1]可能不指向右内存块
我很好奇,是否有一种方法可以使这项工作,使开发人员可以简单地迭代通过像这样的对象数组
到目前为止,我在许多组织类似的库中看到的是,您从未得到像这样的对象数组,而是链表或单个对象指针。有可能吗
另外,在接受@sp2danny的回答(这是绝对正确的)后,我想补充(以防任何人需要)一个可能的解决方法:
// funciton in public API
someInterface * GetSomeClassArrayMember(someInterface*a,unsigned int i);
图书馆内:
someInterface * GetSomeClassArrayMember(someInterface*a,unsigned int i)
{
return &((someClass*)a)[i];
}
然后将使用如下方式:
someInterface *test = NewSomeClassArray(2);
GetSomeClassArrayMember(test,0)->function1();
GetSomeClassArrayMember(test,1)->function1();
ReleaseSomeClassArray(&test);
这样,我就可以满足客户的请求,而不必在头文件中公开除接口类以外的任何内容。您试图做的事情并不琐碎;客户端代码不知道 实际对象的大小,因此不能将其视为数组
一种可能的解决方法是确保所有对象,包括基础,
大小一样
更好的解决方案是使用容器、迭代器、智能指针等和适当的析构函数。您不需要特定的“释放”函数,只需要应用程序
删除
对象即可。@JoachimPileborg但这不是问题所在?写一些类似于经典函数的东西是非常有效的(std::vector
智能指针)替代方案。在我个人的实现/配置中,我获得了8倍的性能提升。@Manu343726但这与我的问题无关?@Sinisa-因此,如果迭代是一个问题,那么就没有办法提供[]
像这样开箱即用。这是不可能做到的,简单明了。如果您重载运算符[],并以某种方式让它识别如何到达下一个元素(类似于迭代器),那么可能……感谢您提供了可接受的答案。我试图向客户解释这一点,但他们坚持“去研究一下,它很简单”态度,所以我不得不在这里尝试一下。
someInterface *test = NewSomeClassArray(2);
GetSomeClassArrayMember(test,0)->function1();
GetSomeClassArrayMember(test,1)->function1();
ReleaseSomeClassArray(&test);