C++ 在C+中使用模板+;
我有一个家庭作业,要求我做以下几点: 设计一个名为FlexArray的模板类,它提供灵活的数组 索引。类的用户可以设置较低的索引和较高的索引 声明对象时索引 用户代码示例: FlexArray a(1,5);//下索引为1,上索引为 5柔性阵列b(-5,10);//下指数为-5,上指数为-5 指数是10 为您的类提供以下函数:C++ 在C+中使用模板+;,c++,templates,C++,Templates,我有一个家庭作业,要求我做以下几点: 设计一个名为FlexArray的模板类,它提供灵活的数组 索引。类的用户可以设置较低的索引和较高的索引 声明对象时索引 用户代码示例: FlexArray a(1,5);//下索引为1,上索引为 5柔性阵列b(-5,10);//下指数为-5,上指数为-5 指数是10 为您的类提供以下函数: 默认构造函数 参数化构造函数,用户在其中指定下索引和上索引 析构函数 复制构造函数 赋值运算符 重载[]运算符,其语义与内置数组中已使用的[]相似 前置条件上的错误可以通
#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
\ifndef H#U模板
#定义H_模板
#包括
使用名称空间std;
模板
类FlexArray
{公众:
FlexArray();//POST:空FlexArray
FlexArray(LI,UI);//POST:参数化构造函数
~FlexArray();//POST:destructor
CopyArr(数组*源数组,数组*目标数组,大小);//POST:复制数组
//重载赋值运算符以添加数组(?)不确定
//这就是原来问题的意思
FlexArray运算符+
(常量FlexArray和其他FlexArray)常量;
//使操作员过载+
FlexArray运算符-
(常量FlexArray和其他FlexArray)常量;
//使操作员过载-
FlexArray运算符[]
(常量FlexArray和其他FlexArray)常量;
//重载操作员[]
私人:
T FlexArray[size];//Flex数组
int size;//项目数数组
int LI;//下索引
int UI;//上索引
};
模板
FlexArray::FlexArray()
//POST:空FlexArray
{size=0;}
模板
FlexArray::~FlexArray()
//POST:析构函数
{ }
模板
FlexArray::CopyArr(数组*源数组,数组*目标数组,大小)
//Pre:接受3个参数,原始数组、要复制的数组以及数组的大小
//POST:复制阵列
{
对于(int i=0;i嗯,我注意到的第一件事是,你没有真正的复制构造函数。如果你认为CopyArr
符合条件,它就不符合条件。语法应该在你的类材料中,但它基本上是一个构造函数,将类的const
引用作为它的唯一参数
你也没有赋值操作符(又名:复制赋值)。同样,确切的语法应该在你的类材料中,但是例程名称应该是operator=
此外,在我看来,您的数组运算符没有“与内置数组中已使用的[]具有类似的语义”。内置数组返回元素类型(在您的情况下是t
,否?),但您的数组返回整个FlexArray
类型
至于模板开发本身,如果您遇到问题,我建议您这样做。首先,将整个过程开发为一个简单的(非模板)类,使用一个简单的类型(例如:int
)。对其进行测试和验证,使其能够以这种方式工作。然后将其转换为模板。即使对于有经验的开发人员来说,跟踪模板中的错误也可能是一项挑战。由于其他答案没有涉及到这一点,因此有一些奇怪的事情:
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]
}
}
模板
FlexArray::CopyArr(数组*源数组,数组*目标数组,大小)
//Pre:接受3个参数,原始数组、要复制的数组以及数组的大小
//POST:复制阵列
{
对于(int i=0;i您需要动态分配。最简单的方法是使用std::vector
您有了一个良好的开端。有几点需要指出
赋值要求使用默认构造函数,但也表示不支持调整数组的大小。这两个要求在逻辑上冲突——您的假设(使用size=0
)似乎符合逻辑,但此默认构造的对象将始终为空。这不是大问题,只是要求中的逻辑断开
采用上下界的参数化构造函数。您从以下方面开始:
FlexArray(LI,UI); // POST: Parameterized Constructor
但是,LI
和UI
需要类型。因为必须支持负索引,所以这应该是有符号类型,如int
复制构造函数是采用相同类型对象的构造函数。您尚未声明其中一个。它的形式应为:
FlexArray(const FlexArray&);
FlexArray& operator=(const FlexArray&);
赋值运算符是允许您执行以下操作的=
运算符:
FlexArray a, b;
b = a;
您尚未声明其中一项。它应采用以下形式:
FlexArray(const FlexArray&);
FlexArray& operator=(const FlexArray&);
实现将类似于复制构造函数(实际上,复制构造函数可以简单地根据赋值运算符实现)
重载的[]
运算符。您已经声明了其中一个运算符,但它的形式并不正确--没有采用适当的参数类型。用法如下所示:
FlexArray arr(-5, 10);
// This is a call to operator[]
arr[3] = value;
考虑到这一点,试着思考它应该采用什么样的参数类型
现在,谈谈功能需求。给定一个上限和下限,您必须创建一个可以使用这些边界进行索引的数组。考虑一下您需要知道什么才能做到这一点。我建议您需要知道dif