鱼C论坛

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

C++ template问题2

[复制链接]
发表于 2019-11-15 10:14:52 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 丶不离不弃 于 2019-11-17 14:01 编辑

我们老师的一个作业,给数组里面的元素增加元素,但是加入了class的内容以及动态数组的内容。
利用template<typename T>,但是我在写的时候,遇到了一个问题就是为啥我的string不满足要求呢?
还有个问题就是我不知道Person这个类怎么写才可以满足main函数的内容:求帮忙谢谢
如下是我的代码:
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. //#include "GrowArray.hh"
  5. template <typename T>
  6. class GrowArray{
  7. public:
  8.     T len;
  9.     T* data;
  10. public:
  11.     GrowArray():len(nullptr),data(nullptr){}
  12.     GrowArray(T len):len(len),data(nullptr){}
  13.     ~GrowArray(){
  14.         delete [] data;
  15.     }
  16.     GrowArray(const GrowArray& orig):len(orig.len),data(new T[orig.len]){
  17.         memcpy(data,orig.data, sizeof(T)*len);
  18.     }
  19.     GrowArray& operator=( GrowArray orig){
  20.         len=orig.len;
  21.         swap(data,orig.data);
  22.         return *this;
  23.     }
  24.     GrowArray(GrowArray&& orig):len(orig.len),data(orig.data){
  25.         orig.data=nullptr;
  26.     }
  27.     void addEnd(T v){
  28.         T* old=data;
  29.         data=new T[len+1];
  30.         memcpy(data,old, sizeof(T)*len);
  31.         data[len++]=v;
  32.     }
  33.     class Iterator{
  34.     private:
  35.         T* current;
  36.         T remaining;
  37.     public:
  38.         Iterator(GrowArray& a):current(a.data),remaining(a.len){}
  39.         bool operator !() const {
  40.             return remaining != 0;          //这一块也有问题。。
  41.         }

  42.         void operator ++() {
  43.             current++;
  44.             remaining--;            //这一块也有问题。。
  45.         }
  46.         T& operator *() const {
  47.             return *current;
  48.         }

  49.     };
  50.     friend Iterator;

  51. };
  52. class Person {
  53.     private:
  54.         uint32_t len;
  55.         char* name;
  56.     public:
  57.         Person(const char n[]) : len(strlen(n)) {
  58.             cout << "Person constructor\n";
  59.             name = new char[len];
  60.             memcpy(name, n, len);
  61.         }
  62.         Person(const Person& orig) : len(strlen(orig.name)){
  63.             cout << "copying Person\n";
  64.             name = new char[len];
  65.             memcpy(name, orig.name, len);
  66.         }
  67.         ~Person() {
  68.             cout << "Destructor\n";
  69.             delete [] name;
  70.         }
  71.     };
  72. int main() {
  73.     GrowArray<int> a(1000);
  74.     for (int i = 0; i < 10; i++)
  75.         a.addEnd(i);
  76.     cout << a << '\n';// 0 1 2 3 4 5 6 7 8 9
  77.     for (GrowArray<int>::Iterator i = a; !i; ++i)
  78.         cout << *i * 2 << ' ';
  79.     cout << '\n';   // 0 2 4 6 8 10 12 14 16 18

  80.     GrowArray<string> b;    //这里的string有问题,不满足
  81.     a.addEnd("hello");
  82.     a.addEnd("yo!");
  83.     a.addEnd("testing");
  84.     cout << b << '\n';
  85.     for (GrowArray<string>::Iterator i = b; !i; ++i)
  86.         cout << *i + "a" << ' '; // helloa yo!a testinga

  87.     GrowArray<Person> c(100);       //class也是
  88.     c.addEnd(Person("Name", 23)); // name and age
  89.     c.addEnd(Person("Name", 21)); // name and age
  90.     cout << c;
  91. }
复制代码





下面是老师给的几个例子:
  1. #include <iostream>
  2. #include <memory.h>
  3. using namespace std;

  4. class GrowArray {
  5. private:
  6.         uint32_t len;
  7.         int* data;
  8. public:
  9.         GrowArray() : len(0), data(nullptr) {}
  10.         ~GrowArray() { delete [] data; } // ok to delete nullptr
  11.         GrowArray(const GrowArray& orig) : len(orig.len), data(new int[orig.len]) {
  12.                 memcpy(data, orig.data, len * sizeof(int));
  13.         }
  14.         GrowArray& operator =(GrowArray orig) {
  15.                 len = orig.len;
  16.                 swap(data, orig.data);
  17.                 return *this;
  18.         }
  19.         GrowArray(GrowArray&& orig) : len (orig.len), data(orig.data) {
  20.                 orig.data = nullptr;
  21.         }
  22.         void addEnd(int v) {
  23.                 int* old = data;
  24.                 data = new int[len +1];
  25.                 memcpy(data, old, len* sizeof(int));
  26.                 data[len++] = v;
  27.         }
  28.        
  29.         class Iterator {
  30.         private:
  31.                 int* current;
  32.                 int remaining;
  33.         public:
  34.     Iterator(GrowArray& a) : current(a.data), remaining(a.len) {
  35.                 }
  36.     bool operator !() const {
  37.                         return remaining != 0;
  38.                 }

  39.                 void operator ++() {
  40.                         current++;
  41.                         remaining--;
  42.                 }
  43.                 int& operator *() const {
  44.                         return *current;
  45.                 }
  46.                
  47.         };
  48.   friend Iterator;       

  49. };



  50. int main() {
  51.         int*p = nullptr;
  52.         delete p; // LEGAL!!!

  53.         GrowArray a;
  54.         for (int i = 0; i < 10; i++)
  55.                 a.addEnd(i);

  56.         for (GrowArray::Iterator i = a; !i; ++i)
  57.                 *i *= 2;

  58.         for (GrowArray::Iterator i = a; !i; ++i)
  59.                 cout << *i;

  60.         //cout << a;
  61. }
复制代码


例子2
  1. #pragma once

  2. #include <iostream>

  3. template<typename T>
  4. class GrowArray {
  5. private:
  6.         uint32_t capacity; // TODO: You preallocate for speed!
  7.         uint32_t length; // current amount used
  8.         T* data;
  9.         void grow() {
  10.                 T* old = data;


  11.                 //TODO: your grow should double every time   1 -->2 -->4 -->
  12.                 data = new T[length+1]; // calls T::T()
  13.                 for (int i = 0; i < length; i++)
  14.                         data[i] = old[i];
  15.                 length++;
  16.         }
  17. public:
  18.         GrowArray() : length(0), data(nullptr) {}

  19.         void addEnd(const T& v) { //TODO: make this O(1)
  20.                 grow(); // O(n)
  21.                 data[length-1] = v;
  22.         }

  23.         T removeEnd() {
  24.     length--;
  25.                 return data[length];
  26.         }

  27.         void addStart(const T& v) {
  28.                 //TODO:!!!
  29.         }

  30.         void removeStart() {

  31.         }
  32.         const T& operator [](int i) const {
  33.                 return data[i];
  34.         }

  35.         T& operator [](int i) {
  36.                 return data[i];
  37.         }

  38.         friend std::ostream& operator <<(std::ostream& s, const GrowArray<T>& list);

  39.         class Iterator {
  40.         private:
  41.                
  42.         public:
  43.                 Iterator(GrowArray<T>& x) {
  44.                        
  45.                 }

  46.                 bool operator !() const {
  47.                         //TODO: return true if NOT done
  48.                 }


  49.                 // unary ++ (pre-increment)
  50.                 operator ++() {

  51.                 }
  52.                 T& operator *() const {

  53.                 }
  54. #if 0
  55.                 // not used!
  56.                 // this ++ int
  57.                 operator ++(int) {

  58.                 }
  59. #endif

  60.         };
  61.        
  62. };

  63. template<typename T>
  64. std::ostream& operator <<(std::ostream& s, const GrowArray<T>& list) {
  65.         for (int i = 0; i < list.length; i++)
  66.                 s << list[i] << ' ';
  67.         return s;
  68. }
复制代码




然后最重要的是我不明白老师给的那个迭代如下代码:
  1. class Iterator {
  2.         private:
  3.                 int* current;
  4.                 int remaining;
  5.         public:
  6.     Iterator(GrowArray& a) : current(a.data), remaining(a.len) {
  7.                 }
  8.     bool operator !() const {
  9.                         return remaining != 0;
  10.                 }

  11.                 void operator ++() {
  12.                         current++;
  13.                         remaining--;
  14.                 }
  15.                 int& operator *() const {
  16.                         return *current;
  17.                 }
  18.                
  19.         };
  20.   friend Iterator;        

  21. };



  22. int main() {
  23.         int*p = nullptr;
  24.         delete p; // LEGAL!!!

  25.         GrowArray a;
  26.         for (int i = 0; i < 10; i++)
  27.                 a.addEnd(i);

  28.         for (GrowArray::Iterator i = a; !i; ++i)
  29.                 *i *= 2;

  30.         for (GrowArray::Iterator i = a; !i; ++i)
  31.                 cout << *i;

  32.         //cout << a;
  33. }
复制代码

以上代码我真是一点都不明白,尤其是下面的:
  1. bool operator !() const {
  2.                         return remaining != 0;
  3.                 }

  4.                 void operator ++() {
  5.                         current++;
  6.                         remaining--;
  7.                 }
  8.                 int& operator *() const {
  9.                         return *current;
  10.                 }
复制代码

求求好心人能够帮忙解释一下,注释一下最好啦~!!谢谢!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-16 09:59:31 From FishC Mobile | 显示全部楼层
本帖最后由 bin554385863 于 2019-11-16 10:10 编辑

你自己就没有加注释的习惯么←_←,一下扔一坨代码,不加注释就算了,代码是干什么的也不说,大家都很忙的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-12 18:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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