Design a template class named FlexArray which offers flexible array
indexes. The user of the class can set the lower index and upper
index when the object is declared.Examples of user code:
FlexArray a (1,5); // lower index is 1 and the upper index is
5 FlexArray b(-5,10); // lower index is -5 and the upper
index is 10Provide the following functions for your class:
- default constructor
- parameterized constructor in which the user specified lower index and upper index
- destructor
- copy constructor
- assignment operator
- overloaded [ ] operator with similar semantics to [ ] already used with built-in arrays.
Errors on PRE conditions may be handled with assert statements or
try/catch blocks. There is no resizing of the array offered.
Subscripts must be in range.
这本书真的没有帮助创建模板.我希望有人能够就这个问题向我提供一些方向,看看我的代码是否在正确的轨道上.我试图通过本书非常有限的范围和在线的不同资源来开始这个问题:
#ifndef H_templates #define H_templates #include <iostream> using namespace std; template <typename T> class FlexArray { public: FlexArray(); // POST: empty FlexArray FlexArray(LI,UI); // POST: Parameterized Constructor ~FlexArray(); // POST: destructor CopyArr(Array* sourceArray,Array* destinationArray,size); // POST: Copies array //Overloading the assignment operators to add arrays(?) Unsure if // this is what is meant by the original question FlexArray operator+ (const FlexArray& otherFlexArray) const; //Overload the operator + FlexArray operator- (const FlexArray& otherFlexArray) const; //Overload the operator - FlexArray operator[] (const FlexArray& otherFlexArray) const; //Overload the operator [] private: T FlexArray[size]; // Flex array int size; // number of items Array int LI; //Lower Index int UI; //Upper Index }; template <typename T> FlexArray<T>::FlexArray () // POST: empty FlexArray { size = 0; } template <typename T> FlexArray<T>::~FlexArray() // POST: destructor { } template <typename T> FlexArray<T>::CopyArr( Array* sourceArray,size) //Pre: Takes 3 arguments,the original array,the array to copy too,and,the size of array // POST: Copies the array { for(int i=0; i<size; i++){ sourceArray[i] = destinationArray[i] } } #endif
解决方法
该作业要求一个默认构造函数,但也指出不支持调整数组大小.这两个要求在逻辑上是冲突的 – 你的假设(使用size = 0)似乎是合乎逻辑的,但是这个默认的构造对象将永远是空的.不是一个巨大的问题,只是一个逻辑断开的要求.
一个参数上限和下限的构造函数.你已经开始这样做了:
FlexArray(LI,UI); // POST: Parameterized Constructor
但是,LI和UI将需要类型.因为你必须支持负指数,所以这应该是一个有符号的类型,像int.
复制构造函数是一个构造函数,它接受相同类型的对象.你没有宣布其中之一.它应该有以下形式:
FlexArray(const FlexArray&);
赋值运算符是=运算符,可以让你这样做:
FlexArray a,b; b = a;
你没有宣布其中之一.应采取以下形式:
FlexArray& operator=(const FlexArray&);
实现将类似于拷贝构造函数(实际上,拷贝构造函数可以简单地按照赋值运算符来实现).
一个过载的[]运算符.你已经宣布了其中之一,但它并不是真正的正确形式 – 不采取适当的参数类型.用法将如下所示:
FlexArray arr(-5,10); // This is a call to operator[] arr[3] = value;
考虑到,尝试考虑应该采取什么参数类型.
现在,对功能要求.给定上限和下限,您必须创建一个可以使用这些边界进行索引的数组.想想你需要知道什么才能做到这一点.我会建议你需要知道上限和下限的差异(这将是数组的大小).您应该检查构造函数上限是否大于下限,否则您无法有效地创建此数组.
现在,为了实际构建你的对象数组,你需要为它们动态分配一些内存.你有一个尝试:
T FlexArray[size]; // Flex array
但这有一些问题.首先,我不认为您可以将其命名为FlexArray,因为这将与您的类的名称相冲突.其次,这需要大小是编译时常数,这与我们的要求相违背.因此,您将需要动态分配T对象的内部数组(如果尚未了解智能指针,则使用新的对象).记住在析构函数中释放对象数组.
现在功能上,[]如何工作?要求是进行边界检查,所以给定一个索引,你必须知道它是否太低(在下限以外)或太高(上限以外),并提出适当的错误.现在,您有一个动态分配(0)的T对象数组 – 给定一个用户指定的索引,您需要找到要返回的适当对象.想想如何做到这一点.
此外,您已经声明和 – 操作符,虽然要求没有指定那些应该在那里.我建议把它们拿出来操作符意味着该数组将被调整大小(与要求相抵触),而 – 是不明确的,减去两个数组是什么意思?这两个函数都可以是有效的,但是这个赋值是不必要的.
没有更多的提示:)