丶不离不弃 发表于 2019-11-15 10:14:52

C++ template问题2

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

我们老师的一个作业,给数组里面的元素增加元素,但是加入了class的内容以及动态数组的内容。
利用template<typename T>,但是我在写的时候,遇到了一个问题就是为啥我的string不满足要求呢?
还有个问题就是我不知道Person这个类怎么写才可以满足main函数的内容:求帮忙谢谢
如下是我的代码:
#include <iostream>
#include <string>
using namespace std;
//#include "GrowArray.hh"
template <typename T>
class GrowArray{
public:
    T len;
    T* data;
public:
    GrowArray():len(nullptr),data(nullptr){}
    GrowArray(T len):len(len),data(nullptr){}
    ~GrowArray(){
      delete [] data;
    }
    GrowArray(const GrowArray& orig):len(orig.len),data(new T){
      memcpy(data,orig.data, sizeof(T)*len);
    }
    GrowArray& operator=( GrowArray orig){
      len=orig.len;
      swap(data,orig.data);
      return *this;
    }
    GrowArray(GrowArray&& orig):len(orig.len),data(orig.data){
      orig.data=nullptr;
    }
    void addEnd(T v){
      T* old=data;
      data=new T;
      memcpy(data,old, sizeof(T)*len);
      data=v;
    }
    class Iterator{
    private:
      T* current;
      T remaining;
    public:
      Iterator(GrowArray& a):current(a.data),remaining(a.len){}
      bool operator !() const {
            return remaining != 0;          //这一块也有问题。。
      }

      void operator ++() {
            current++;
            remaining--;            //这一块也有问题。。
      }
      T& operator *() const {
            return *current;
      }

    };
    friend Iterator;

};
class Person {
    private:
      uint32_t len;
      char* name;
    public:
      Person(const char n[]) : len(strlen(n)) {
            cout << "Person constructor\n";
            name = new char;
            memcpy(name, n, len);
      }
      Person(const Person& orig) : len(strlen(orig.name)){
            cout << "copying Person\n";
            name = new char;
            memcpy(name, orig.name, len);
      }
      ~Person() {
            cout << "Destructor\n";
            delete [] name;
      }
    };
int main() {
    GrowArray<int> a(1000);
    for (int i = 0; i < 10; i++)
      a.addEnd(i);
    cout << a << '\n';// 0 1 2 3 4 5 6 7 8 9
    for (GrowArray<int>::Iterator i = a; !i; ++i)
      cout << *i * 2 << ' ';
    cout << '\n';   // 0 2 4 6 8 10 12 14 16 18

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

    GrowArray<Person> c(100);       //class也是
    c.addEnd(Person("Name", 23)); // name and age
    c.addEnd(Person("Name", 21)); // name and age
    cout << c;
}




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

class GrowArray {
private:
        uint32_t len;
        int* data;
public:
        GrowArray() : len(0), data(nullptr) {}
        ~GrowArray() { delete [] data; } // ok to delete nullptr
        GrowArray(const GrowArray& orig) : len(orig.len), data(new int) {
                memcpy(data, orig.data, len * sizeof(int));
        }
        GrowArray& operator =(GrowArray orig) {
                len = orig.len;
                swap(data, orig.data);
                return *this;
        }
        GrowArray(GrowArray&& orig) : len (orig.len), data(orig.data) {
                orig.data = nullptr;
        }
        void addEnd(int v) {
                int* old = data;
                data = new int;
                memcpy(data, old, len* sizeof(int));
                data = v;
        }
       
        class Iterator {
        private:
                int* current;
                int remaining;
        public:
    Iterator(GrowArray& a) : current(a.data), remaining(a.len) {
                }
    bool operator !() const {
                        return remaining != 0;
                }

                void operator ++() {
                        current++;
                        remaining--;
                }
                int& operator *() const {
                        return *current;
                }
               
        };
friend Iterator;       

};



int main() {
        int*p = nullptr;
        delete p; // LEGAL!!!

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

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

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

        //cout << a;
}

例子2
#pragma once

#include <iostream>

template<typename T>
class GrowArray {
private:
        uint32_t capacity; // TODO: You preallocate for speed!
        uint32_t length; // current amount used
        T* data;
        void grow() {
                T* old = data;


                //TODO: your grow should double every time   1 -->2 -->4 -->
                data = new T; // calls T::T()
                for (int i = 0; i < length; i++)
                        data = old;
                length++;
        }
public:
        GrowArray() : length(0), data(nullptr) {}

        void addEnd(const T& v) { //TODO: make this O(1)
                grow(); // O(n)
                data = v;
        }

        T removeEnd() {
    length--;
                return data;
        }

        void addStart(const T& v) {
                //TODO:!!!
        }

        void removeStart() {

        }
        const T& operator [](int i) const {
                return data;
        }

        T& operator [](int i) {
                return data;
        }

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

        class Iterator {
        private:
               
        public:
                Iterator(GrowArray<T>& x) {
                       
                }

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


                // unary ++ (pre-increment)
                operator ++() {

                }
                T& operator *() const {

                }
#if 0
                // not used!
                // this ++ int
                operator ++(int) {

                }
#endif

        };
       
};

template<typename T>
std::ostream& operator <<(std::ostream& s, const GrowArray<T>& list) {
        for (int i = 0; i < list.length; i++)
                s << list << ' ';
        return s;
}



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

                void operator ++() {
                        current++;
                        remaining--;
                }
                int& operator *() const {
                        return *current;
                }
               
      };
friend Iterator;      

};



int main() {
      int*p = nullptr;
      delete p; // LEGAL!!!

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

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

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

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

                void operator ++() {
                        current++;
                        remaining--;
                }
                int& operator *() const {
                        return *current;
                }
求求好心人能够帮忙解释一下,注释一下最好啦~!!谢谢!!

bin554385863 发表于 2019-11-16 09:59:31

本帖最后由 bin554385863 于 2019-11-16 10:10 编辑

你自己就没有加注释的习惯么←_←,一下扔一坨代码,不加注释就算了,代码是干什么的也不说,大家都很忙的。
页: [1]
查看完整版本: C++ template问题2