gpt4 book ai didi

c++ - 在 C++ 中使用模板

转载 作者:可可西里 更新时间:2023-11-01 16:13:03 26 4
gpt4 key购买 nike

我有一个家庭作业要求我做以下事情:

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, 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

最佳答案

您的开端不错。有几点需要指出。

赋值要求一个默认构造函数,但也声明不支持调整数组大小。这两个要求在逻辑上是冲突的——您的假设(使用 size=0)似乎是合乎逻辑的,但是这个默认构造的对象将始终为空。这不是一个大问题,只是需求中的逻辑脱节。

采用上下界的参数化构造函数。你已经开始了:

FlexArray(LI,UI);               // POST: Parameterized Constructor

但是,LIUI 需要类型。由于您必须支持负索引,因此这应该是有符号类型,例如 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;

鉴于此,请尝试考虑它应该采用哪种参数类型。

现在,关于功能需求。给定上限和下限,您必须创建一个可以使用这些边界进行索引的数组。想想你需要知道什么才能做到这一点。我建议您需要知道上限和下限的差异(这将是您的数组的 SIZE)。您应该在构造函数中检查上限是否大于下限,否则您无法有效地创建此数组。

现在,要真正构建对象数组,您需要为它们动态分配一些内存。你可以试试这个:

T FlexArray[size];      // Flex array

但这有一些问题。首先,我认为您不能将其命名为 FlexArray,因为这会与您的类名冲突。其次,这要求 size 是一个编译时常量,这与我们的要求不符。因此,您将需要动态分配 T 对象的内部数组(如果您还没有了解智能指针,请使用 new)。记得在析构函数中释放这个对象数组。

现在在功能上,[] 将如何工作?要求是进行边界检查,因此给定一个索引,您必须知道它是太低(超出下限)还是太高(超出上限)并引发适当的错误。现在您有一个动态分配的(基于 0 的)T 对象数组——给定一个用户指定的索引,您需要找到要返回的适当对象。想想如何实现这一目标。

此外,您还声明了 +- 运算符,但要求并未指定它们应该存在。我建议把它们拿出来。 +运算符暗示数组会被调整大小(与需求相矛盾),而-有歧义,两个数组相减是什么意思?这两个函数可能都是有效的,但对于这个赋值来说是不必要的。

没有更多提示:)

关于c++ - 在 C++ 中使用模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7854221/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com