首頁 > 軟體

c++模板自定義陣列

2022-03-21 16:01:56

前言:

製造通用模板,建立自定義的陣列,

一個陣列,裡面有這麼幾個屬性,陣列容量,陣列元素個數,陣列本身記憶體地址,這幾個資料都是定義私有型別,提供有參構造,讓使用者可以構造出這個陣列物件。下面是有參構造和拷貝構造和解構函式還有operator=過載的程式碼

在前面類別範本中成員函數建立有這個主意問題,最好的辦法就是把類別範本寫在一個hpp的檔案中,不要拆開寫成多個檔案

1.自定義陣列.hpp--檔案

#pragma once
#include<iostream>
using namespace std;
#include<string>
template<class T>
class Myarry
{
public:
  Myarry() {};//自己建立有參構造,編譯器就不提供無參構造,所以必須自己寫一次無參構造,即使是空實現也要寫!
  Myarry(int capacity)//有參建構函式
  {
    this->capacity = capacity;
    this->size = 0;
    this->marry = new T[this->capacity];//把陣列建立在堆區
  }
  ~Myarry()//解構函式
  {
    if (this->marry !=NULL)
    {
      delete []this->marry;//解構陣列必須加[],否則會引發斷點
      marry = NULL;
      this->capacity = 0;
      this->size = 0;
    }
  }
  Myarry(const Myarry& arr)//拷貝構造
  {
    this->capacity = arr.capacity;
    this->size = arr.size;
    this->marry = new T[arr.capacity];
    for (int i = 0; i < arr.size; i++)//把資料拷貝過來
    {
      this->marry[i] = arr->marry[i];
    }
  }
  //等號賦值
  Myarry& operator=(const Myarry& arr)
  {
    if (this->marry != NULL)//如果有資料先清空,再賦值
    {
      delete[]this->marry;
      this->marry  = NULL;
      this->size = 0;
      this->capacity = 0;
    }
    this->capacity = arr.capacity;
    this->size = arr.size;
    this->marry = new T[this->capacity];
    for (int i = 0; i < this->size; i++)//將資料進行拷貝
    {
      this->marry[i] = arr.marry[i];
    }
    return *this;
  }
  void pushback(const T&ptr)//尾加法
  {
    if (this->capacity == this->size)
    {
      cout << "容量已滿!" << endl;
      return;
    }
    this->marry[this->size] = ptr;
    this->size++;
  }
  void deleteback()//尾刪法
  {
    if (this->size == 0)
    {
      cout << "資料為零,沒有可刪資料!" << endl;
    }
    delete this->marry[this->size - 1];
    this->size--;
  }
  T & operator[](int index)//通過下標存取陣列,並使它作為左值加&
  {
    if (index > this->capacity)
    {
      cout << "存取越界!" << endl;
      exit(0);
    }
    return this->marry[index];
  }
  int gercapacity()//獲取陣列容量
  {
    return this->capacity;
  }
  int getsize()//獲取陣列元素個數
  {
    return this->size;
  }
private:
  T * marry;//陣列
  int capacity;//陣列容量
  int size;//陣列元素個數
};

2.測試檔案

#include "自定義陣列.hpp"
class person
{
public:
  person()
  {
    this->age = 0;
  }
  int age;
  string name;
};
void text01()
{
  person p[4];
  p[0].age = 20;
  p[0].name = "張三";
  p[1].age = 0;
  p[1].name = "李四";
  p[2].age = 40;
  p[2].name = "王五";
  p[3].age = 80;
  p[3].name = "趙六";
  Myarry<person>pp(10);
  for (int i = 0; i < 4; i++)
  {
    pp.pushback(p[i]);
  }
  for (int i = 0; i < pp.getsize(); i++)
  {
    cout << pp[i].name<<pp[i].age<< endl;
  }
}
void text02()
{
  Myarry<int>inta(10);
  for (int i = 0; i < 5; i++)
  {
    inta.pushback(i);
  }
  for (int i = 0; i < inta.getsize(); i++)
  {
    cout << inta[i] << endl;
  }
}
int main()
{
  /*text02();*/
  text01();
  return 0;
}

到此這篇關於c++模板自定義陣列的文章就介紹到這了,更多相關c++自定義陣列內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com