C++ 在C+中使用模板+;

C++ 在C+中使用模板+;,c++,templates,C++,Templates,我有一个家庭作业,要求我做以下几点: 设计一个名为FlexArray的模板类,它提供灵活的数组 索引。类的用户可以设置较低的索引和较高的索引 声明对象时索引 用户代码示例: FlexArray a(1,5);//下索引为1,上索引为 5柔性阵列b(-5,10);//下指数为-5,上指数为-5 指数是10 为您的类提供以下函数: 默认构造函数 参数化构造函数,用户在其中指定下索引和上索引 析构函数 复制构造函数 赋值运算符 重载[]运算符,其语义与内置数组中已使用的[]相似 前置条件上的错误可以通

我有一个家庭作业,要求我做以下几点:

设计一个名为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