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);
}