Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 纯虚拟类(接口)和继承它的对象的内部数组分配_C++_Arrays_Class_Pure Virtual - Fatal编程技术网

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

我不确定我的想法是否可行,这就是我想要实现的目标:

> p>我正在开发一个C++库,它将被其他开发人员(客户端)使用。
  • 库应该公开只包含接口类(纯虚拟类)的头。没有别的了

  • 开发人员将从公开的标题调用函数来分配对象(例如刚体)并释放它们

  • 我希望有一个函数可以返回对象的经典数组(使用new[]),而不是链表或使用std::

  • 下面是它的样子:

    // 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);