在C中使用模板

前端之家收集整理的这篇文章主要介绍了在C中使用模板前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个功课要求我做以下事情:

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 10

Provide the following functions for your class:

  1. default constructor
  2. parameterized constructor in which the user specified lower index and upper index
  3. destructor
  4. copy constructor
  5. assignment operator
  6. 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对象数组 – 给定一个用户指定的索引,您需要找到要返回的适当对象.想想如何做到这一点.

此外,您已经声明和 – 操作符,虽然要求没有指定那些应该在那里.我建议把它们拿出来操作符意味着该数组将被调整大小(与要求相抵触),而 – 是不明确的,减去两个数组是什么意思?这两个函数都可以是有效的,但是这个赋值是不必要的.

没有更多的提示:)

猜你在找的C&C++相关文章