60 C++ - 类模板的应用

简介: 60 C++ - 类模板的应用

设计一个数组模板类(MyArray),完成对不同类型元素的管理

#pragma once
template<class T>
class MyArray
{
public:
  explicit MyArray(int capacity)
  {
    this->m_Capacity = capacity;
    this->m_Size = 0;
    // 如果T是对象,那么这个对象必须提供默认的构造函数
    pAddress = new T[this->m_Capacity];
  }
  //拷贝构造
  MyArray(const MyArray & arr)
  {
    this->m_Capacity = arr.m_Capacity;
    this->m_Size = arr.m_Size;
    this->pAddress = new T[this->m_Capacity];
    for (int i = 0; i < this->m_Size;i++)
    {
      this->pAddress[i] = arr.pAddress[i];
    }
  }
  //重载[] 操作符  arr[0]
  T& operator [](int index)
  {
    return this->pAddress[index]; 
  }
  //尾插法
  void Push_back(const T & val)
  {
    if (this->m_Capacity == this->m_Size)
    {
      return;
    }
    this->pAddress[this->m_Size] = val;
    this->m_Size++;
  }
  void Pop_back()
  {
    if (this->m_Size == 0)
    {
      return;
    }
    this->m_Size--;
  }
  int getSize()
  {
    return this->m_Size;
  }
  //析构
  ~MyArray()
  {
    if (this->pAddress != NULL)
    {
      delete[] this->pAddress;
      this->pAddress = NULL;
      this->m_Capacity = 0; 
      this->m_Size = 0;
    }
  }
private:
  T * pAddress;  //指向一个堆空间,这个空间存储真正的数据
  int m_Capacity; //容量
  int m_Size;   // 大小
};
测试代码:
class Person{
public:
  Person(){}
  Person(string name, int age){
    this->mName = name;
    this->mAge = age;
  }
public:
  string mName;
  int mAge;
};
void PrintMyArrayInt(MyArray<int>& arr){
  for (int i = 0; i < arr.getSize(); i++){
    cout << arr[i] << " ";
  }
  cout << endl;
}
void PrintMyPerson(MyArray<Person>& personArr)
{
  for (int i = 0; i < personArr.getSize(); i++){
    cout << "姓名:" << personArr[i].mName << " 年龄: " << personArr[i].mAge << endl;
  }
}
  MyArray<int> myArrayInt(10);
  for (int i = 0; i < 9; i++)
  {
    myArrayInt.Push_back(i);
  }
  myArrayInt.Push_back(100);
  PrintMyArrayInt(myArrayInt);
MyArray<Person> myArrayPerson(10);
  Person p1("德玛西亚", 30);
  Person p2("提莫", 20);
  Person p3("孙悟空",18);
  Person p4("赵信", 15);
  Person p5("赵云", 24);
  myArrayPerson.Push_back(p1);
  myArrayPerson.Push_back(p2);
  myArrayPerson.Push_back(p3);
  myArrayPerson.Push_back(p4);
  myArrayPerson.Push_back(p5);


目录
相关文章
|
6天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
29 4
|
7天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
25 4
|
21天前
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
|
30天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
27 4
|
30天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
23 4
|
30天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
21 1
|
30天前
|
编译器 程序员 C++
【C++打怪之路Lv7】-- 模板初阶
【C++打怪之路Lv7】-- 模板初阶
16 1
|
1月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
1月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)
|
1月前
|
存储 编译器 C语言
【C++打怪之路Lv3】-- 类和对象(上)
【C++打怪之路Lv3】-- 类和对象(上)
16 0