C++问题:最近学C++,用模板实现数组类的封装,其中用到了“[]“符号的重载,但是在用“[]“的时候出了一些问题,有大神帮忙看看,多谢。

在test.cpp文件的main函数中,应用了"[]"的重载:arr1[10] = 992; 填10的时候,系统运行就会报错,填其他数都能正常,这是为什么? 报错如图:
在这里插入图片描述

源文件:

test.hpp文件:

#pragma once
#include<iostream>
#include<string>


using namespace std;


template<class T>
class MyArray
{
    
    
private:
	T*  m_pDateAddr;  //数据
	int m_Cap;        //容量
	int m_Len;        //长度

public:
	MyArray(int cap)        //构造函数:初始化
	{
    
    
		this->m_Cap = cap;
		this->m_Len = 0;
		this->m_pDateAddr = new T[this->m_Cap];
	}

	MyArray(MyArray& arr) //拷贝构造函数:初始化
	{
    
    
		if (NULL != this->m_pDateAddr)
		{
    
    
			delete[] this->m_pDateAddr;
			this->m_pDateAddr = NULL;
		}

		this->m_Cap = arr.m_Cap;
		this->m_Len = arr.m_Len;

		if (NULL != arr.m_pDateAddr)
		{
    
    
			this->m_pDateAddr = new T[arr.m_Cap];
			for (int i = 0; i < this->m_Cap; i++)
			{
    
    
				this->m_pDateAddr[i] = arr.m_pDateAddr[i];
			}
		}
		//cout << "MyArray(MyArray& arr) 拷贝函数" << endl;
	}

	MyArray& operator=(const MyArray& arr)  //符号"="重载函数 
	{
    
    
		if (NULL != this->m_pDateAddr)
		{
    
    
			delete[] this->m_pDateAddr;
			this->m_pDateAddr = NULL;
		}

		this->m_Cap = arr.m_Cap;
		this->m_Len = arr.m_Len;

		if (NULL != arr.m_pDateAddr)
		{
    
    
			this->m_pDateAddr = new T[arr.m_Cap];
			for (int i = 0; i < this->m_Cap; i++)
			{
    
    
				this->m_pDateAddr[i] = arr.m_pDateAddr[i];
			}
		}

		return *this;
	}
	 
	void tailAdd(T val)//尾插法
	{
    
    
		if (this->m_Len < this->m_Cap)
		{
    
    
			this->m_pDateAddr[this->m_Len] = val;
			this->m_Len++;
		}
		else
		{
    
    
			cout << "插入的长度达到最大!" << endl;
		}
	}

	void tailDel()   //尾删法
	{
    
    
		if (0 == this->m_Len)  //长度为0,返回
		{
    
    
			return;
		}
		this->m_Len--;          //只要长度减一就行了
	}

	int getCapacity() //获取数组容量
	{
    
    
		return this->m_Cap;
	}

	int getLength() //获取数组长度
	{
    
    
		return this->m_Len;
	}

	T& operator[](int index)  //符号"="重载函数 
	{
    
    
		T temp;
		if ((index > this->m_Len) ||(0 > index))
		{
    
    
			cout << "操作符[]指定的下标长度错误!" << endl;
			return temp;
		}

		return this->m_pDateAddr[index];
	}

	~MyArray()  //析构造函数
	{
    
    
		if (NULL != m_pDateAddr)
		{
    
    
			delete[] m_pDateAddr;
			m_pDateAddr = NULL;
		}
	}
};

test.cpp文件:

#include<iostream>
#include<string>
#include"test.hpp"

using namespace std;

void printInt(MyArray<int> &arr)   //打印int类型的数组
{
    
    
	cout << "printInt:" << endl;

	for (int i = 0; i < arr.getLength(); i++)
	{
    
    
		cout << arr[i] << endl;
	}
}
void addIntVal(MyArray<int>& arr)  //添加数据到int类型的数组
{
    
    
	for (int i = 0; i < arr.getCapacity(); i++)
	{
    
    
		arr.tailAdd(i);
	}
}

void delIntVal(MyArray<int>& arr)   //尾删法int
{
    
    
	arr.tailDel();
	arr.tailDel();
}

void printChar(MyArray<char> &arr)  //打印char类型的数组
{
    
    
	cout << "printChar:" << endl;
	for (int i = 0; i < arr.getLength(); i++)
	{
    
    
		cout << arr[i] << endl;
	}
}

void addCharVal(MyArray<char>& arr)  //添加数据到char类型的数组
{
    
    
	char c = 'a';
	for (int i = 0; i < arr.getCapacity(); i++)
	{
    
    
		arr.tailAdd(c + i);
	}
}

void delCharVal(MyArray<char>& arr)  //尾删法char
{
    
    
	arr.tailDel();
}

class Person
{
    
    
public:
	Person() {
    
    };                     //这个必须写,否则报错
	Person(string name, int age)
	{
    
    
		m_age = age;
		m_name = name;
	}
	int m_age;
	string m_name;
};

void printPerson(MyArray<Person>& arr)  //打印char类型的数组
{
    
    
	cout << "printPerson:" << endl;
	for (int i = 0; i < arr.getLength(); i++)
	{
    
    
		cout << "姓名:" << arr[i].m_name << " 年龄:" << arr[i].m_age << endl;
	}
}

void delPersonVal(MyArray<Person>& arr)  //尾删法char
{
    
    
	arr.tailDel();
}

//main函数
int main()
{
    
    
	cout << "--------------------Int数据类型---------------------" << endl;
	MyArray<int> arr1(10);
	MyArray<int> arr2(10);
	addIntVal(arr1);
	arr1[10] = 992;  //这里重载了[],但为什么 [] 中填10的时候,程序运行后系统就会提示Debug Error 的错误,填其他数据没有问题。
	printInt(arr1);
	delIntVal(arr1);
	printInt(arr1);

	cout << "--------------------Char数据类型---------------------" << endl;
	MyArray<char> arr3(10);
	addCharVal(arr3);
	MyArray<char> arr4(10);
	arr4 = arr3;
	printChar(arr3);
	delCharVal(arr3);
	printChar(arr3);

	cout << "------------------自定义数据类型---------------------" << endl;
	Person p1("孙悟空", 999);
	Person p2("猪八戒", 888);     
	MyArray<Person> arr5(10);   //定义数组
	arr5.tailAdd(p1);           //添加数据
	arr5.tailAdd(p2);
	printPerson(arr5);          //打印
	delPersonVal(arr5);
	printPerson(arr5);

	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_19693355/article/details/126631944