Реализация специального массива с помощью конструктора - PullRequest
0 голосов
/ 12 октября 2019

Реализация специального массива с помощью конструктора.

#include<iostream>
using namespace std;
int length(const int *s){
  int L;
  for(L=0; s[L] != '\0'; L++){};
  return L;
}
void scopy(int destination[], const int source[], int dstart=0)
{
  int i;
  for(i=0; source[i] != '\0'; i++)
    destination[dstart+i]=source[i];
  destination[dstart+i]=source[i];    // copy the '\0' itself
}
class eArray
{
        int *ptr;
        void * operator new(unsigned int sz);
        public:
        eArray()
        {
            ptr=NULL;
        }
        int size()const {cout<<"Hi";return length(ptr);}
        int& operator[](int i) const {return ptr[i];}

        eArray(const eArray &rhs)
        {
            ptr = new int[length(rhs.ptr)+1];
            scopy(ptr,rhs.ptr);
        }
        eArray& operator=(const int* rhs)
        {
            delete [] ptr;
            ptr = new int[length(rhs)+1];
            scopy(ptr,rhs);
            return *this;
        }
        eArray& operator=(const eArray &rhs)
        {
            delete [] ptr;
            ptr = new int[length(rhs.ptr)+1];
            scopy(ptr,rhs.ptr);
            return *this;
        }
        void push_back(int v)
        {
            cout<<"Hi2";
            int *a=new int[length(ptr)+2];
            scopy(a,ptr);
            a[length(ptr)]=v;
            a[length(ptr)+1]='\0';
            delete[] ptr;
            ptr=new int[length(a)+1];
            scopy(ptr,a);
        }
};

Ошибка при выполнении при вводе. Я думаю, что это неправильно в функции length (). Пожалуйста, помогите. Когда я даю число в качестве ввода (скажем, 2), он печатает Hi2 в функции push_back и завершается.

1 Ответ

0 голосов
/ 12 октября 2019

eArray() конструктор по умолчанию инициализирует ptr в NULL. Но тогда почти каждая операция принимает ненулевое значение ptr;push_back среди них. Все они вызывают length(ptr), а length всегда разыменовывает указатель, никогда не проверяет его на нулевое значение.

Как написано, единственный способ создать экземпляр eArray e, для которого e.ptr != NULL - это operator=(const int*), присваивая ему необработанный указатель int*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...