鱼C论坛

 找回密码
 立即注册
查看: 779|回复: 0

C++怎么避免访问空串

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

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

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

x
本帖最后由 bin554385863 于 2019-11-21 23:30 编辑

第149行和第156行的函数怎么能避免访问空串

  1. #ifndef NUMBERS_H
  2. #define NUMBERS_H
  3. #include <iostream>
  4. #include <initializer_list>
  5. #include <string>
  6. template <typename tp>
  7. class numbers
  8. {
  9. private:
  10.     size_t numsLen;
  11.     tp *numsPtr;
  12. public:
  13.     //1--默认构造
  14.     numbers() : numsLen(0), numsPtr(nullptr) {}
  15.     //2--使用C风格数字数组构造
  16.     numbers(const tp *arr, const size_t arrSize);
  17.     //3--可变参数构造
  18.     numbers(std::initializer_list<tp> list);
  19.     //4--拷贝构造
  20.     numbers(const numbers<tp> &nums);
  21.     /*--------------------------------------------------------*/
  22.     //5--按索引获取元素;按索引修改元素的值
  23.     tp &at(const size_t index) const;
  24.     //6--对象的大小
  25.     size_t const size() const;
  26.     /*--------------------------------------------------------*/
  27.     //7--重载下标运算符
  28.     tp &operator[](const size_t index) const;
  29.     //8--深度拷贝
  30.     numbers<tp> &operator=(const numbers<tp> &nums);
  31.     //9--重载流运算符<<
  32.     friend std::ostream &operator<<(std::ostream &os, const numbers<tp> &nums)
  33.     {
  34.         size_t sz = nums.size();
  35.         for (size_t i = 0; i < sz; i++)
  36.         {
  37.             os << nums[i] << " ";
  38.         }
  39.         return os;
  40.     }
  41.     /*--------------------------------------------------------*/
  42.     //10--添加元素
  43.     numbers<tp> operator+(const tp num) const;
  44.     numbers<tp>& operator+=(const tp num)
  45.     {
  46.         *this = *this + num;
  47.         return *this;
  48.     }
  49.     //11--合并对象
  50.     numbers<tp> operator+(const numbers<tp> &nums) const;
  51.     numbers<tp>& operator+=(const numbers<tp> &nums)
  52.     {
  53.         *this = *this + nums;
  54.         return *this;
  55.     }
  56.     /*--------------------------------------------------------*/
  57.     //12--判断数据在对象中存在
  58.     bool operator%(const tp num) const;
  59.     //13--判断子对象是否父对象的子串
  60.     bool operator%(const numbers<tp>& nums) const;
  61.     /*--------------------------------------------------------*/
  62.     //14--返回数据出现的次数
  63.     size_t operator/(tp num) const;
  64.     //15--返回两个对象共同的元素
  65.     numbers<tp> operator/(const numbers<tp> &nums) const;
  66.     //15-1返回并赋值
  67.     numbers<tp> operator/=(const numbers<tp> &nums)
  68.     {
  69.         *this = *this / nums;
  70.         return *this;
  71.     }
  72.     /*--------------------------------------------------------*/
  73.     //16--删除元素
  74.     numbers<tp> operator-(const tp num) const;
  75.     numbers<tp> operator-(const tp num)
  76.     {
  77.         *this = *this - num;
  78.         return *this;
  79.     }
  80.     //17--删除父对象中与子对象中重复的元素
  81.     numbers<tp> operator-(const numbers<tp> &nums) const;
  82.     numbers<tp> operator-(const numbers<tp> &nums)
  83.     {
  84.         *this = *this - nums;
  85.         return *this;
  86.     }
  87.     //18--按索引删除元素(数据必须显示声明size_t类型)失败返回空串
  88.     numbers<tp> operator-(const size_t index) const;
  89.     numbers<tp> operator-(const size_t index)
  90.     {
  91.         *this = *this - this->at(index);
  92.         return *this;
  93.     }
  94.     /*--------------------------------------------------------*/
  95.     ~numbers()
  96.     {
  97.         delete[] numsPtr;
  98.     }
  99. };
  100. //2--使用C风格数字数组构造
  101. template <typename tp>
  102. numbers<tp>::numbers(const tp *arr, const size_t arrSize) : numsLen(arrSize)
  103. {
  104.     numsPtr = new tp[numsLen];
  105.     for (size_t i = 0; i < numsLen; i++)
  106.     {
  107.         *(numsPtr + i) = *(arr + i);
  108.     }
  109. }
  110. //3--可变参数构造
  111. template <typename tp>
  112. numbers<tp>::numbers(std::initializer_list<tp> list) : numsLen(list.size())
  113. {
  114.     numsPtr = new tp[numsLen];
  115.     for (size_t i = 0; i < numsLen; i++)
  116.     {
  117.         *(numsPtr + i) = *(list.begin() + i);
  118.     }
  119. }
  120. //4--拷贝构造
  121. template <typename tp>
  122. numbers<tp>::numbers(const numbers<tp> &nums)
  123. {
  124.     if (nums.numsPtr != nullptr)
  125.     {
  126.         numsLen = nums.numsLen;
  127.         numsPtr = new tp[numsLen];
  128.         for (size_t i = 0; i < numsLen; i++)
  129.         {
  130.             *(numsPtr + i) = *(nums.numsPtr + i);
  131.         }
  132.     }
  133.     else
  134.     {
  135.         numsLen = 0;
  136.         numsPtr = nullptr;
  137.     }
  138.    
  139. }
  140. /*--------------------------------------------------------------------*/
  141. //5--按索引获取元素;按索引修改元素的值
  142. template <typename tp>
  143. inline tp &numbers<tp>::at(const size_t index) const
  144. {
  145.     return numsPtr[index];
  146. }
  147. //6--对象的大小
  148. template <typename tp>
  149. inline const size_t numbers<tp>::size() const
  150. {
  151.     return numsLen;
  152. }
  153. /*--------------------------------------------------------*/
  154. //7--重载下标运算符
  155. template <typename tp>
  156. inline tp &numbers<tp>::operator[](const size_t index) const
  157. {
  158.     return numsPtr[index];
  159. }
  160. /*--------------------------------------------------------*/
  161. //8--深度拷贝
  162. template <typename tp>
  163. numbers<tp> &numbers<tp>::operator=(const numbers<tp> &nums)
  164. {
  165.     if ((numsPtr != nullptr)&&(nums.numsPtr != nullptr))//非空串的深度拷贝
  166.     {
  167.         numsLen = nums.numsLen;
  168.         delete[] numsPtr;
  169.         numsPtr = new tp[numsLen];
  170.         for (size_t i = 0; i < numsLen; i++)
  171.         {
  172.             *(numsPtr + i) = *(nums.numsPtr + i);
  173.         }
  174.     }
  175.     if((numsPtr == nullptr)&&(nums.numsPtr != nullptr))//调用对象为空,操作对象非空
  176.     {
  177.         numsLen = nums.numsLen;
  178.         numsPtr = new tp[numsLen];
  179.         for (size_t i = 0; i < nums.numsLen; i++)
  180.         {
  181.             this->at(i) = *(nums.numsPtr + i);
  182.         }
  183.     }
  184.     if ((numsPtr != nullptr)&&(nums.numsPtr == nullptr))//调用对象非空,操作对象为空
  185.     {
  186.         numsLen = 0;
  187.         delete [] numsPtr;
  188.         numsPtr = nullptr;
  189.     }
  190.    
  191.     return *this;
  192. }
  193. /*--------------------------------------------------------*/
  194. //10--添加元素
  195. template <typename tp>
  196. numbers<tp> numbers<tp>::operator+(const tp num) const
  197. {
  198.     numbers<tp> t_nums = *this;
  199.     if (t_nums.numsPtr != nullptr)
  200.     {
  201.         tp *t_numsPtr = new tp[numsLen + 1];
  202.         for (size_t i = 0; i < numsLen; i++)
  203.         {
  204.             *(t_numsPtr + i) = this->at(i);
  205.         }
  206.         *(t_numsPtr + numsLen) = num;
  207.         t_nums.numsLen++;
  208.         delete[] t_nums.numsPtr;
  209.         t_nums.numsPtr = t_numsPtr;
  210.     }
  211.     else
  212.     {
  213.         t_nums.numsLen+=1;
  214.         t_nums.numsPtr = new tp[numsLen]{num};
  215.     }

  216.     return t_nums;
  217. }
  218. //11--合并对象
  219. template <typename tp>
  220. numbers<tp> numbers<tp>::operator+(const numbers<tp> &nums) const
  221. {
  222.     numbers<tp> t_nums;
  223.     if (numsPtr != nullptr)
  224.     {
  225.         t_nums = *this;
  226.         for (size_t i = 0; i < nums.numsLen; i++)
  227.         {
  228.             t_nums = t_nums + *(nums.numsPtr + i);
  229.         }
  230.     }
  231.     else
  232.     {
  233.         t_nums = nums;
  234.     }

  235.     return t_nums;
  236. }
  237. /*--------------------------------------------------------*/
  238. //12--判断数据在对象中是否存在
  239. template <typename tp>
  240. bool numbers<tp>::operator%(const tp num) const
  241. {
  242.     bool flag = false;
  243.     if (numsPtr != nullptr)
  244.     {
  245.         for (size_t i = 0; i < numsLen; i++)
  246.         {
  247.             if (num == *(numsPtr + i))
  248.             {
  249.                 flag = true;
  250.                 break;
  251.             }
  252.         }
  253.     }
  254.     return flag;
  255. }
  256. //13--判断子对象是否父对象的子串
  257. template <typename tp>
  258. bool numbers<tp>::operator%(const numbers<tp> &nums) const
  259. {
  260.     bool flag = false;
  261.     size_t count = 1;
  262.     if (numsLen > nums.numsLen)
  263.     {
  264.         for (size_t i = 0; i < nums.numsLen; i++)
  265.         {
  266.             if ((*this) % (*(nums.numsPtr + i)))
  267.             {
  268.                 count++;
  269.                 if (count == nums.numsLen)
  270.                 {
  271.                     break;
  272.                 }
  273.             }
  274.         }
  275.         if (count == nums.numsLen)
  276.         {
  277.             flag = true;
  278.         }
  279.     }
  280.     if (nums.numsPtr == 0)
  281.     {
  282.         flag = true;
  283.     }
  284.     return flag;
  285. }
  286. /*--------------------------------------------------------*/
  287. //14--返回数据出现的次数
  288. template <typename tp>
  289. size_t numbers<tp>::operator/(tp num) const
  290. {
  291.     size_t count = 0;
  292.     if (numsPtr != nullptr)
  293.     {
  294.         for (size_t i = 0; i < numsLen; i++)
  295.         {
  296.             if (this->at(i) == num)
  297.             {
  298.                 count++;
  299.             }
  300.         }
  301.     }
  302.     return count;
  303. }
  304. //15--返回两个对象共同的元素
  305. template <typename tp>
  306. numbers<tp> numbers<tp>::operator/(const numbers<tp> &nums) const
  307. {
  308.     numbers<tp> r_nums;
  309.     if ((numsPtr != nullptr)&&(nums.numsPtr != nullptr))
  310.     {
  311.         for (size_t i = 0; i < nums.numsLen; i++)
  312.         {
  313.             if ((*this)% (*(nums.numsPtr + i)))
  314.             {
  315.                 r_nums = r_nums + *(nums.numsPtr + i);
  316.             }
  317.         }
  318.     }
  319.     return r_nums;
  320. }
  321. /*--------------------------------------------------------*/
  322. //16--删除元素
  323. template <typename tp>
  324. numbers<tp> numbers<tp>::operator-(const tp num) const
  325. {
  326.     numbers<tp> r_nums;
  327.     if (numsPtr != nullptr)
  328.     {
  329.         for (size_t i = 0; i < numsLen; i++)
  330.         {
  331.             if (this->at(i) != num)
  332.             {
  333.                 r_nums = r_nums + *(numsPtr + i);
  334.             }
  335.         }
  336.     }
  337.     return r_nums;
  338. }
  339. //17--删除父对象中与子对象中重复的元素
  340. template <typename tp>
  341. numbers<tp> numbers<tp>::operator-(const numbers<tp>& nums) const
  342. {
  343.     numbers<tp> r_nums;
  344.     size_t count = 0;
  345.     if ((numsPtr != nullptr)&&(nums.numsPtr != nullptr))
  346.     /*两个非空数字串*/
  347.     {
  348.         r_nums = *this;
  349.         for (size_t i = 0; i < nums.numsLen; i++)
  350.         {
  351.             r_nums = r_nums - *(nums.numsPtr + i);            
  352.         }
  353.         if (r_nums.numsLen == 0)
  354.         {
  355.             delete [] r_nums.numsPtr;
  356.             r_nums.numsPtr = nullptr;
  357.         }
  358.     }
  359.     else if ((numsPtr != nullptr)&&(nums.numsPtr == nullptr))
  360.     /*子串为空*/
  361.     {
  362.         r_nums = *this;
  363.     }
  364.     return r_nums;
  365. }
  366. //18--按索引删除元素(数据必须是size_t类型)失败返回空串
  367. template <typename tp>
  368. numbers<tp> numbers<tp>::operator-(const size_t index) const
  369. {
  370.     numbers<tp> r_nums;
  371.     if ((index < numsLen ) && (numsPtr != nullptr))
  372.     {
  373.         for (size_t i = 0; i < index; i++)
  374.         {
  375.             r_nums = r_nums + *(numsPtr + i);
  376.         }
  377.         for (size_t i = index + 1; i < numsLen; i++)
  378.         {
  379.             r_nums = r_nums + *(numsPtr + i);
  380.         }
  381.     }
  382.     return r_nums;
  383. }
  384. #endif
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-8 22:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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