鱼C论坛

 找回密码
 立即注册
查看: 1655|回复: 1

[技术交流] numbers类

[复制链接]
发表于 2019-11-21 11:47:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 bin554385863 于 2019-11-21 13:32 编辑

数字的字符串
2019年11月21日11:44:00

numbers.h
  1. #ifndef NUMBERS_H
  2. #define NUMBERS_H
  3. #include <iostream>
  4. #include <initializer_list>
  5. template <typename tp>
  6. class numbers
  7. {
  8. private:
  9.     size_t numsLen;
  10.     tp *numsPtr;

  11. public:
  12.     //默认构造
  13.     numbers() : numsLen(0), numsPtr(nullptr) {}
  14.     //使用C风格数字数组构造
  15.     numbers(const tp *arr, const size_t arrSize);
  16.     //可变参数构造
  17.     numbers(std::initializer_list<tp> list);
  18.     //拷贝构造
  19.     numbers(const numbers<tp> &nums);
  20.     /*--------------------------------------------------------*/
  21.     //按索引获取元素;按索引修改元素的值
  22.     tp &at(const size_t index);
  23.     //对象的大小
  24.     size_t size()const;
  25.     /*--------------------------------------------------------*/
  26.     //重载下标运算符
  27.     tp &operator[](const size_t index);
  28.     //重载函数调用符()
  29.     numbers<tp> &operator()(const numbers<tp> &nums);
  30.     /*--------------------------------------------------------*/
  31.     //添加元素
  32.     numbers<tp> operator+(const tp num);
  33.     //合并对象
  34.     numbers<tp> operator+(const numbers<tp> &nums);
  35.     /*--------------------------------------------------------*/
  36.     //深度拷贝
  37.     numbers<tp> &operator=(const numbers<tp> &nums);
  38.     friend std::ostream& operator<<(std::ostream& os, numbers<tp>& nums)
  39.     {
  40.         size_t sz = nums.size();
  41.         for (size_t i = 0; i < sz; i++)
  42.         {
  43.             os<<nums[i]<<" ";
  44.         }
  45.         return os;
  46.     }
  47.     ~numbers()
  48.     {
  49.         delete [] numsPtr;
  50.     }
  51. };

  52. #endif
复制代码

----------------------------
numbers.cpp
  1. #include "numbers.h"
  2. //使用C风格数字数组构造
  3. template <typename tp>
  4. numbers<tp>::numbers(const tp *arr, const size_t arrSize) : numsLen(arrSize)
  5. {
  6.     numsPtr = new tp[numsLen];
  7.     for (size_t i = 0; i < numsLen; i++)
  8.     {
  9.         *(numsPtr + i) = *(arr + i);
  10.     }
  11. }
  12. //可变参数构造
  13. template <typename tp>
  14. numbers<tp>::numbers(std::initializer_list<tp> list) : numsLen(list.size())
  15. {
  16.     numsPtr = new tp[numsLen];
  17.     for (size_t i = 0; i < numsLen; i++)
  18.     {
  19.         *(numsPtr + i) = *(list.begin() + i);
  20.     }
  21. }
  22. //拷贝构造
  23. template <typename tp>
  24. numbers<tp>::numbers(const numbers<tp> &nums) : numsLen(nums.numsLen)
  25. {
  26.     numsPtr = new tp[numsLen];
  27.     for (size_t i = 0; i < numsLen; i++)
  28.     {
  29.         *(numsPtr + i) = *(nums.numsPtr + i);
  30.     }
  31. }
  32. /*--------------------------------------------------------------------*/
  33. //按索引获取元素;按索引修改元素的值
  34. template <typename tp>
  35. inline tp &numbers<tp>::at(const size_t index)
  36. {
  37.     return numsPtr[index];
  38. }
  39. //对象的大小
  40. template <typename tp>
  41. inline size_t numbers<tp>::size() const
  42. {
  43.     return numsLen;
  44. }
  45. /*--------------------------------------------------------*/
  46. //重载下标运算符
  47. template <typename tp>
  48. inline tp &numbers<tp>::operator[](const size_t index)
  49. {
  50.     return numsPtr[index];
  51. }
  52. template <typename tp>
  53. numbers<tp> &numbers<tp>::operator()(const numbers<tp> &nums)
  54. {
  55.     delete[] numsPtr;
  56.     numsLen = nums.numsLen;
  57.     numsPtr = new tp[numsLen];
  58.     for (size_t i = 0; i < numsLen; i++)
  59.     {
  60.         *(numsPtr + i) = *(nums.numsPtr + i);
  61.     }
  62.     return *this;
  63. }
  64. /*--------------------------------------------------------*/
  65. //添加元素
  66. template <typename tp>
  67. numbers<tp> numbers<tp>::operator+(const tp num)
  68. {
  69.     numbers<tp> t_nums(numsPtr, numsLen);
  70.     if (t_nums.numsPtr != nullptr)
  71.     {
  72.         tp *t_numsPtr = new tp[numsLen + 1];
  73.         for (size_t i = 0; i < numsLen; i++)
  74.         {
  75.             *(t_numsPtr + i) = this->at(i);
  76.         }
  77.         *(t_numsPtr + numsLen) = num;
  78.         t_nums.numsLen++;
  79.         delete[] t_nums.numsPtr;
  80.         t_nums.numsPtr = t_numsPtr;
  81.     }
  82.     else
  83.     {
  84.         t_nums.numsLen+=1;
  85.         t_nums.numsPtr = new tp[numsLen]{num};
  86.     }

  87.     return t_nums;
  88. }
  89. //合并对象
  90. template <typename tp>
  91. numbers<tp> numbers<tp>::operator+(const numbers<tp> &nums)
  92. {
  93.     numbers<tp> t_nums(numsPtr, numsLen);
  94.     for (size_t i = 0; i < nums.numsLen; i++)
  95.     {
  96.         t_nums = t_nums + *(nums.numsPtr+i);
  97.     }
  98.     return t_nums;
  99. }
  100. /*--------------------------------------------------------*/
  101. //深度拷贝
  102. template <typename tp>
  103. numbers<tp> &numbers<tp>::operator=(const numbers<tp> &nums)
  104. {
  105.     if (numsPtr != nullptr)
  106.     {
  107.         numsLen = nums.numsLen;
  108.         delete[] numsPtr;
  109.         numsPtr = new tp[numsLen];
  110.         for (size_t i = 0; i < numsLen; i++)
  111.         {
  112.             *(numsPtr + i) = *(nums.numsPtr + i);
  113.         }
  114.     }
  115.     else
  116.     {
  117.         numsLen = nums.numsLen;
  118.         numsPtr = new tp[numsLen];
  119.         for (size_t i = 0; i < nums.numsLen; i++)
  120.         {
  121.             this->at(i) = *(nums.numsPtr + i);
  122.         }
  123.     }
  124.     return *this;
  125. }
复制代码

--------------------------------------------------------------
main.c
  1. #include "numbers.cpp"
  2. int main(int argc, char const *argv[])
  3. {
  4.     numbers<int> nums = {1, 2}, a, b = {5, 6}, c = {7, 8, 9};
  5.     a(nums);//测试()的重载
  6.     a = a + 3 + 4 + b + c + 10;//测试+号的重载
  7.     std::cout<<a<<"\nsize = "<<a.size()<<std::endl;
  8.     return 0;
  9. }
复制代码

----------------------------------------------------------------------
Microsoft Windows [版本 10.0.18363.476]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.1\debugAdapters\bin\WindowsDebugLauncher.exe
--stdin=Microsoft-MIEngine-In-k52q2f0n.kxj --stdout=Microsoft-MIEngine-Out-nocoxtbv.vhe --stderr=Microsoft-MIEngine-Error-xpdxnbxc.0yk
--pid=Microsoft-MIEngine-Pid-xqgq4qdr.b0g --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
1 2 3 4 5 6 7 8 9 10
size = 10


E:\Users\admin\Documents\VScode>
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-21 14:12:21 | 显示全部楼层
本帖最后由 bin554385863 于 2019-11-21 14:15 编辑

---删除()的重载:
原因:与=的深度复制功能重复
numbers.h
  1. #ifndef NUMBERS_H
  2. #define NUMBERS_H
  3. #include <iostream>
  4. #include <initializer_list>
  5. template <typename tp>
  6. class numbers
  7. {
  8. private:
  9.     size_t numsLen;
  10.     tp *numsPtr;

  11. public:
  12.     //默认构造
  13.     numbers() : numsLen(0), numsPtr(nullptr) {}
  14.     //使用C风格数字数组构造
  15.     numbers(const tp *arr, const size_t arrSize);
  16.     //可变参数构造
  17.     numbers(std::initializer_list<tp> list);
  18.     //拷贝构造
  19.     numbers(const numbers<tp> &nums);
  20.     /*--------------------------------------------------------*/
  21.     //按索引获取元素;按索引修改元素的值
  22.     tp &at(const size_t index);
  23.     //对象的大小
  24.     size_t size()const;
  25.     /*--------------------------------------------------------*/
  26.     //重载下标运算符
  27.     tp &operator[](const size_t index);
  28.     /*--------------------------------------------------------*/
  29.     //添加元素
  30.     numbers<tp> operator+(const tp num);
  31.     //合并对象
  32.     numbers<tp> operator+(const numbers<tp> &nums);
  33.     /*--------------------------------------------------------*/
  34.     //深度拷贝
  35.     numbers<tp> &operator=(const numbers<tp> &nums);
  36.     friend std::ostream& operator<<(std::ostream& os, numbers<tp>& nums)
  37.     {
  38.         size_t sz = nums.size();
  39.         for (size_t i = 0; i < sz; i++)
  40.         {
  41.             os<<nums[i]<<" ";
  42.         }
  43.         return os;
  44.     }
  45.     ~numbers()
  46.     {
  47.         delete [] numsPtr;
  48.     }
  49. };

  50. #endif
复制代码

numbers.cpp
  1. #include "numbers.h"
  2. //使用C风格数字数组构造
  3. template <typename tp>
  4. numbers<tp>::numbers(const tp *arr, const size_t arrSize) : numsLen(arrSize)
  5. {
  6.     numsPtr = new tp[numsLen];
  7.     for (size_t i = 0; i < numsLen; i++)
  8.     {
  9.         *(numsPtr + i) = *(arr + i);
  10.     }
  11. }
  12. //可变参数构造
  13. template <typename tp>
  14. numbers<tp>::numbers(std::initializer_list<tp> list) : numsLen(list.size())
  15. {
  16.     numsPtr = new tp[numsLen];
  17.     for (size_t i = 0; i < numsLen; i++)
  18.     {
  19.         *(numsPtr + i) = *(list.begin() + i);
  20.     }
  21. }
  22. //拷贝构造
  23. template <typename tp>
  24. numbers<tp>::numbers(const numbers<tp> &nums) : numsLen(nums.numsLen)
  25. {
  26.     numsPtr = new tp[numsLen];
  27.     for (size_t i = 0; i < numsLen; i++)
  28.     {
  29.         *(numsPtr + i) = *(nums.numsPtr + i);
  30.     }
  31. }
  32. /*--------------------------------------------------------------------*/
  33. //按索引获取元素;按索引修改元素的值
  34. template <typename tp>
  35. inline tp &numbers<tp>::at(const size_t index)
  36. {
  37.     return numsPtr[index];
  38. }
  39. //对象的大小
  40. template <typename tp>
  41. inline size_t numbers<tp>::size() const
  42. {
  43.     return numsLen;
  44. }
  45. /*--------------------------------------------------------*/
  46. //重载下标运算符
  47. template <typename tp>
  48. inline tp &numbers<tp>::operator[](const size_t index)
  49. {
  50.     return numsPtr[index];
  51. }
  52. /*--------------------------------------------------------*/
  53. //添加元素
  54. template <typename tp>
  55. numbers<tp> numbers<tp>::operator+(const tp num)
  56. {
  57.     numbers<tp> t_nums(numsPtr, numsLen);
  58.     if (t_nums.numsPtr != nullptr)
  59.     {
  60.         tp *t_numsPtr = new tp[numsLen + 1];
  61.         for (size_t i = 0; i < numsLen; i++)
  62.         {
  63.             *(t_numsPtr + i) = this->at(i);
  64.         }
  65.         *(t_numsPtr + numsLen) = num;
  66.         t_nums.numsLen++;
  67.         delete[] t_nums.numsPtr;
  68.         t_nums.numsPtr = t_numsPtr;
  69.     }
  70.     else
  71.     {
  72.         t_nums.numsLen+=1;
  73.         t_nums.numsPtr = new tp[numsLen]{num};
  74.     }

  75.     return t_nums;
  76. }
  77. //合并对象
  78. template <typename tp>
  79. numbers<tp> numbers<tp>::operator+(const numbers<tp> &nums)
  80. {
  81.     numbers<tp> t_nums(numsPtr, numsLen);
  82.     for (size_t i = 0; i < nums.numsLen; i++)
  83.     {
  84.         t_nums = t_nums + *(nums.numsPtr+i);
  85.     }
  86.     return t_nums;
  87. }
  88. /*--------------------------------------------------------*/
  89. //深度拷贝
  90. template <typename tp>
  91. numbers<tp> &numbers<tp>::operator=(const numbers<tp> &nums)
  92. {
  93.     if (numsPtr != nullptr)
  94.     {
  95.         numsLen = nums.numsLen;
  96.         delete[] numsPtr;
  97.         numsPtr = new tp[numsLen];
  98.         for (size_t i = 0; i < numsLen; i++)
  99.         {
  100.             *(numsPtr + i) = *(nums.numsPtr + i);
  101.         }
  102.     }
  103.     else
  104.     {
  105.         numsLen = nums.numsLen;
  106.         numsPtr = new tp[numsLen];
  107.         for (size_t i = 0; i < nums.numsLen; i++)
  108.         {
  109.             this->at(i) = *(nums.numsPtr + i);
  110.         }
  111.     }
  112.     return *this;
  113. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-23 10:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表