具有动态数组中堆上元素的类集

Posted

技术标签:

【中文标题】具有动态数组中堆上元素的类集【英文标题】:Class Set With Elements on Heap in A Dynamic Array 【发布时间】:2014-01-29 23:37:14 【问题描述】:

如何创建一个Set 对象,将其元素存储在int 值的动态数组中?具体来说,如何创建具有这些规范的空集?


//  Morally Right (M) 2014 1-ling. All morals preserved.

class Set 


public:

    Set();
    Set( int element );
    Set(const Set& s );
    ~Set();

    bool contains( unsigned int element );
    unsigned int getSize();

    int operator[]( unsigned int index ) const;
    Set& operator=( const Set s );
    Set operator+=( const Set s ) const;
    Set operator-=( const Set s ) const;
    Set operator*=( const Set s ) const;

    friend ostream& operator<<( ostream& o , const Set& s );
    friend istream& operator>>( istream& i , const Set& s );

private:

    int *array = new int[size]; // IS THIS THE PATH TO SUCCESS?
    int* elements();
    unsigned int size();
    void copy( const Set& s );
    void resize( unsigned int new_size );

;

【问题讨论】:

Set 是用户定义的类还是某种容器的名称? 如果你去UCLA,请不要复制这段代码。自己做。如果您以完全相同的结构上交作业,我不希望教授认为我扯掉了这个。 你现在的代码到底有什么问题? 我在找这个吗:***.com/questions/4029870/… 是的。动态意味着可以在运行时提供大小。然而,这个任务的主要部分是你需要在你提到的每个函数中创建、复制和删除动态数组。此外,您通常不应该在头文件中执行此操作,而是在您的实现文件中执行此操作。 【参考方案1】:

通常我会建议您使用std::vector&lt;T&gt;,但由于您的作业告诉您使用原始 C 样式数组,因此我将不得不重申我的答案:

如果您持有资源(例如动态内存),则必须实现 RAII 习惯用法,以便在封装结构超出范围时释放资源。为此,您将需要一个析构函数,以便您可以适当地调用delete/delete[]。如果您使用的是动态内存并且它没有被释放,那么这样做会导致内存泄漏。

但是为了分配资源,你需要一个调用new/new[]的构造函数。要实现复制,您需要一个复制构造函数,将资源从另一个对象复制到您的对象。


现在我已经列出了说明,您可以开始了。请注意,您已经拥有适当的默认构造函数、复制构造函数和析构函数来执行上述活动。要创建指向内存的指针,您可以简单地使用int* element 并将其分配给内存。

For more information, see this post.

【讨论】:

如果他被允许使用 STL 为什么不直接使用 std::set 呢? 我不能。说明:您的主管希望您对您的 Set 类进行一些设计更改。最大的变化是让你的Set 对象不将它们的元素存储在int 值的向量中,而是在int 值的动态数组中的堆上。因此,您需要重新定义复制构造函数、赋值运算符= 和析构函数,以防止浅拷贝和内存泄漏。 我只是喜欢教授如何灌输明天的思想,期望每个人都将在“主管”下工作。 @user3250884 在我更新答案时给我一些。 说 C 风格的数组是不好的做法有点苛刻。有很多有效的用例。

以上是关于具有动态数组中堆上元素的类集的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中的类中创建类对象的动态数组

Java 类集初探

vector

java中堆和栈

显示动态 HTML 表单元素,其中包含具有订单配置的数组对象

Java类集总结之一