C++ 实现一个数组类

C++ 实现一个数组类,c++,arrays,C++,Arrays,正如标题所说,我的任务的一部分是实现一个数组类。教授给了我们开头的标题样式,为我们创建函数声明。在前面的例子中,我已经尽了最大的努力来定义这些函数,但是我在理解到底发生了什么时遇到了很多困难。发布一个完整的头文件可能有点过分,但无论如何,我都会尝试解释我遇到的问题。这是我的密码: #ifndef ARRAY_H #define ARRAY_H #include <iostream> #include <string> using namespace std; templ

正如标题所说,我的任务的一部分是实现一个数组类。教授给了我们开头的标题样式,为我们创建函数声明。在前面的例子中,我已经尽了最大的努力来定义这些函数,但是我在理解到底发生了什么时遇到了很多困难。发布一个完整的头文件可能有点过分,但无论如何,我都会尝试解释我遇到的问题。这是我的密码:

#ifndef ARRAY_H
#define ARRAY_H
#include <iostream>
#include <string>
using namespace std;

template <class T>
class Array {
private:
    int size;
    T * arr;
public:
    int getSize();

    Array();
    Array(int size);
    Array(Array & other);
    Array(T[], int n);
    ~Array();
    Array & operator=(Array & rhs);
    Array & operator+(Array & rhs); // append
    T & operator[](int i); //allow read and write
    const T & operator[](int n) const; // readonly
    void print(int n = 5);
    void print(ostream & out, int n);
    operator int *() { return arr; }
    friend ostream & operator <<(ostream & out, Array <T>& rhs);
};

template <class T>
int Array<T>::getSize() {
    return size;
}

template <class T>
Array<T>::Array() {
    arr = new T[];
}

template <class T>
Array<T>::Array(int size) {
    arr = new T[size];
}

template <class T>
Array<T>::Array(Array & other) {
    size = other.getSize();
    arr = new T[size];
    copy(arr[0], arr[size + 1], other.arr[0]);
}

template <class T>
Array<T>::Array(T[], int n) {
    size = n;
    arr = new T[n];
}

template <class T>
Array<T>::~Array() {
    if (arr) {
        delete arr;
    }
}

template <class T>
Array<T>& Array<T>::operator=(Array & rhs) {
    if (this != &rhs) {
        delete[] arr;
        size = rhs.getSize();
        arr = new T[size];
        copy(arr[0], arr[size+1], rhs.arr[0]);
    }
    return *this;
}

template <class T>
Array<T>& Array<T>::operator+(Array & rhs) {
    Array *tmp;

    tmp = new Array(size + rhs.getSize());
    return *tmp;
}

template <class T>
T& Array<T>::operator[](int i) {
    assert(0 <= i && i < size);
    return arr[i];
}

template <class T>
const T& Array<T>::operator[] (int n) const {
    assert(0 <= i && i < size);
    return arr[i];
}

template <class T>
void Array<T>::print(ostream &out, int n) {
    for (size_t i = 0; i < n; i++) {
        out << arr[i] << " ";
    }
}

template <class T>
void Array<T>::print(int n = 5) {
     print(cout, n);
}

template <class T>
ostream & operator << (ostream & out, Array<T> & rhs) {
    out << "( " << rhs.getSize() << ")";
    return out;
}

#endif
#ifndef数组
#定义数组
#包括
#包括
使用名称空间std;
模板
类数组{
私人:
整数大小;
T*arr;
公众:
int getSize();
数组();
数组(整数大小);
阵列(阵列和其他);
数组(T[],int n);
~Array();
数组和运算符=(数组和rhs);
数组和运算符+(数组和rhs);//追加
T运算符[](int i);//允许读写
常量T&运算符[](int n)常量;//只读
无效打印(整数n=5);
作废打印(打印和打印,内部编号);
运算符int*(){return arr;}
friend ostream&运营商
  • 在第46行尝试为
    Array(Array&other);
    执行复制构造函数时,我得到了错误
    error C2664:'char*strcpy(char*,const char*)“:无法将参数1从“int*”转换为“char*”
    它一直指向
    strcpy
    函数,但我不确定它要求我更改什么。同一行有两个错误,第二个错误是
    无法将参数1从“std::string*”转换为“char*”
  • 这里的问题是,
    strcpy
    用于在两个内存位置之间复制
    char
    类型。但是,您的模板参数
    T
    实际上可以是任何类型,因此,如果要实现泛型性,在这里使用
    strcpy
    是不合适的。直截了当的方法(但效率不高)复制构造函数的实现类似于:

    template <class T>
    Array<T>::Array(const Array &other) : size(other.size), arr(new T[size])
    {
      for (int i = 0; i < size; ++i)
        arr[i] = other.arr[i];
    }
    
    3) 对于第85行的
    T&operator[](int i);//允许读写
    ,我想知道是否应该用
    i
    插槽创建一个新数组。教授留下的允许、读写注释让我很困惑。另外,对于下面的函数,
    array::T&operator[](int n)const;
    注释说是只读的,所以我假设应该返回包含
    n
    项的数组

    操作符[]
    用于为访问
    数组
    中的特定项提供语法糖,给定一些索引
    i
    。没有它,以下内容将无法工作:

    Array<int> arr(42);
    std::cout << arr[0];
    
    4) 我为
    void print(int n=5);
    函数留下了一条注释。但总而言之,我希望能够在每行的数组中打印出一定数量的项,但没有多维数组。我尝试了两个
    循环,但它只是卡在同一个数组项上

    5) 我不确定为什么需要
    无效打印(ostream&out,int n);
    。它应该覆盖上面的打印语句吗

    <>你要找的术语是“重载”。“重写”在C++术语中有非常特殊的含义,在这个场景中不适用。

    从声明来看,第二个
    print
    签名的目的似乎是支持不同类型的输出流(顺便说一句,
    cout
    是其中的一种)。您在这里要做的是在第二个版本的基础上实现第一个版本的
    print
    。事实上,它们甚至不需要是模板函数:

    void print(ostream &out, int n)
    {
      for (size_t i = 0; i < n; ++i)
        out << pets[i] << " ";
    }
    
    void print(int n)
    {
      print(cout, n);
    }
    

    strcpy
    函数专门用于复制字符串,而不是一般数据。您可能希望使用(或)。对于点1和2,您可能希望使用
    memcpy
    而不是
    strcpy
    。您的代码还存在一些其他问题,例如
    运算符[]的返回类型
    Array::T
    函数。我对1和2进行了更改,因此
    strcpy(arr,other.arr);
    现在是
    memcpy(arr,rhs.arr,sizeof(arr));
    。不再出现错误。对于
    操作符[]
    functions,我需要返回模板类的数组吗?请将代码发布到此网站,而不是使用外部链接。另外,请修复IDE,以便在缩进时选项卡插入空格,最好使用2或4个空格。感谢您的帮助。我删除了打印函数的模板函数行,但它只是显示了一个空格设置其他错误,例如数组未声明。这是否意味着绝对有必要设置这些错误?不过,其他所有更改都可以正常工作。编辑:另外,奇怪的是,在修复代码后,我现在有链接器错误。您可以将签名更改为类似于
    模板无效打印的内容(const-array&arr,int-n,ostream&out);
    template <class T>
    T& Array<T>::operator[] (int i) 
    {
      assert(0 <= i && i < size);
      return arr[i];
    }
    
    template <class T>
    const T& Array<T>::operator[] (int i) const
    {
      assert(0 <= i && i < size);
      return arr[i];
    }
    
    void print(ostream &out, int n)
    {
      for (size_t i = 0; i < n; ++i)
        out << pets[i] << " ";
    }
    
    void print(int n)
    {
      print(cout, n);
    }
    
      template <typename T>
      void print(const Array<T> &arr, int n)
      {
        print(arr, n, cout);
      }