具有动态数组中堆上元素的类集
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<T>
,但由于您的作业告诉您使用原始 C 样式数组,因此我将不得不重申我的答案:
如果您持有资源(例如动态内存),则必须实现 RAII 习惯用法,以便在封装结构超出范围时释放资源。为此,您将需要一个析构函数,以便您可以适当地调用delete
/delete[]
。如果您使用的是动态内存并且它没有被释放,那么这样做会导致内存泄漏。
但是为了分配资源,你需要一个调用new
/new[]
的构造函数。要实现复制,您需要一个复制构造函数,将资源从另一个对象复制到您的对象。
现在我已经列出了说明,您可以开始了。请注意,您已经拥有适当的默认构造函数、复制构造函数和析构函数来执行上述活动。要创建指向内存的指针,您可以简单地使用int* element
并将其分配给内存。
For more information, see this post.
【讨论】:
如果他被允许使用 STL 为什么不直接使用 std::set 呢? 我不能。说明:您的主管希望您对您的 Set 类进行一些设计更改。最大的变化是让你的Set
对象不将它们的元素存储在int
值的向量中,而是在int
值的动态数组中的堆上。因此,您需要重新定义复制构造函数、赋值运算符=
和析构函数,以防止浅拷贝和内存泄漏。
我只是喜欢教授如何灌输明天的思想,期望每个人都将在“主管”下工作。
@user3250884 在我更新答案时给我一些。
说 C 风格的数组是不好的做法有点苛刻。有很多有效的用例。以上是关于具有动态数组中堆上元素的类集的主要内容,如果未能解决你的问题,请参考以下文章