我有一份作业要求我做以下事情:
设计一个名为FlexArray的模板类,它提供灵活的数组索引.该类的用户可以在声明对象时设置较低的索引和较高的索引.
用户代码示例:
FlexArray a(1,5); //较低的索引为1,较高的索引为5 FlexArray b(-5,10); //较低的索引为-5,较高的索引为10
为您的班级提供以下功能:
- 默认构造函数
- 参数化构造函数,其中用户指定较低索引和较高索引
- 析构函数
- 复制构造函数
- 赋值运算符
- 与[]已经与内置数组一起使用的类似语义的重载[]运算符.
PRE条件的错误可以使用assert语句或try/catch块来处理.没有调整阵列的大小.下标必须在范围内.
这本书对创建模板毫无帮助.我希望有人能就这个问题向我提供一些指导,看看我的代码是否在正确的轨道上.我试图通过本书非常有限的范围和在线的不同资源来解决这个问题:
#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, Array* destinationArray, 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
Run Code Online (Sandbox Code Playgroud)
你有一个良好的开端.有几点需要指出.
赋值请求默认构造函数,BUT还声明不支持调整数组大小.这两个要求在逻辑上是冲突的 - 您的假设(使用size=0)似乎是合乎逻辑的,但是此默认构造对象将始终为空.这不是一个大问题,只是需求中的逻辑断开.
一个参数化的构造函数,取上限和下限.你已经开始这样做了:
FlexArray(LI,UI); // POST: Parameterized Constructor
Run Code Online (Sandbox Code Playgroud)
但是,LI并且UI需要类型.由于你必须支持负索引,这应该是一个签名类型,如int.
复制构造函数是一个构造函数,它接受相同类型的对象.你还没有声明其中之一.它应该具有以下形式:
FlexArray(const FlexArray&);
Run Code Online (Sandbox Code Playgroud)
赋值运算符是=允许您执行此操作的运算符:
FlexArray a, b;
b = a;
Run Code Online (Sandbox Code Playgroud)
你还没有声明其中之一.它应采取以下形式:
FlexArray& operator=(const FlexArray&);
Run Code Online (Sandbox Code Playgroud)
实现类似于复制构造函数(实际上,复制构造函数可以简单地根据赋值运算符实现).
一个重载的[]运算符.你已经声明了其中之一,但它的形式并不正确 - 没有采用适当的参数类型.用法如下:
FlexArray arr(-5, 10);
// This is a call to operator[]
arr[3] = value;
Run Code Online (Sandbox Code Playgroud)
鉴于此,尝试考虑它应该采用什么参数类型.
现在,关于功能要求.给定上限和下限,您必须创建一个可以使用这些边界索引的数组.想想你需要知道什么才能做到这一点.我建议您需要知道上限和下限的差异(这将是您的数组的SIZE).您应该检查构造函数中上限是否大于下限,否则您无法有效地创建此数组.
现在,要实际构建对象数组,您需要为它们动态分配一些内存.你试试这个:
T FlexArray[size]; // Flex array
Run Code Online (Sandbox Code Playgroud)
但这有一些问题.首先,我不认为你可以命名,FlexArray因为这会与你班级的名字相冲突.其次,这需要这size是一个编译时间常数,它违背了我们的要求.因此,您需要动态分配内部T对象数组(new如果您还没有学过智能指针,请使用).请记住在析构函数中释放此对象数组.
现在功能上,如何[]工作?要求是进行边界检查,因此给定一个索引,你必须知道它是否太低(在下限之外)或太高(在上限之外)并引发适当的错误.现在您有一个动态分配的(基于0的)T对象数组- 给定用户指定的索引,您需要找到要返回的相应对象.想想如何实现这一目标.
此外,您已声明+和-运营商,但要求未指定那些应该在那里.我建议把它们拿出来.该+运营商意味着阵列将被重新调整(这是由需求矛盾),且-是模糊的,这是什么意思减去两个数组?这两个函数都可能有效,但是这种分配是不必要的.
没有更多提示:)