在C中使用模板
我有一个功课要求我做以下事情:
这本书真的没有帮助创建模板.我希望有人能够就这个问题向我提供一些方向,看看我的代码是否在正确的轨道上.我试图通过本书非常有限的范围和在线的不同资源来开始这个问题: #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对象数组 – 给定一个用户指定的索引,您需要找到要返回的适当对象.想想如何做到这一点. 此外,您已经声明和 – 操作符,虽然要求没有指定那些应该在那里.我建议把它们拿出来操作符意味着该数组将被调整大小(与要求相抵触),而 – 是不明确的,减去两个数组是什么意思?这两个函数都可以是有效的,但是这个赋值是不必要的. 没有更多的提示:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |