Добрый день. Мне нужно написать программу с использованием шаблона. То есть шаблон класса динамического массива. Вот мой код. Пытаюсь его тестировать. Вводится всё хорошо, но вот с выводом не могу разобраться. Например, ввожу длину массива = 4. И ввожу числа от 1 до 4. На выходе получаю следующее: -842150451 1 2 -842150451 3 -842150451 -842150451 4. Подскажите, пожалуйста, с чем связана данная ошибка и как её можно исправить?
Array.h
#pragma once
#include <iostream>
#include <conio.h>
using namespace std;
template <typename T>
class Array
{
T* arr;
int size;
int begin;
int end;
void create(int n, int len, int beg);
public:
Array();
Array(int n);
int length();
Array& clear();
Array& init(int n);
Array& pushFront(T a);
Array& pushBack(T a);
T popFront();
T popBack();
T& operator[](int i);
~Array();
};
template <typename T> Array<T>::Array()
{
create(1, 0, 0);
//size = 1;
//arr = new T;
}
template <typename T> Array<T>::Array(int n)
{
create(n, n, 0);
/*if (n < 1)
{
n = 1;
}
size = n;
arr = new T[n];*/
}
template <typename T> Array<T>::~Array()
{
delete[] arr;
}
template <typename T> void Array<T>::create(int n, int len, int beg)
{
if (n < 1)
{
n = 1;
}
if (len < 0)
{
len = 0;
}
size = n;
begin = beg;
end = beg + len;
arr = new T[n];
}
template <typename T> int Array<T>::length()
{
return end - begin;
}
template <typename T> Array<T>& Array<T>::clear()
{
delete[] arr;
create(1, 0, 0);
return *this;
}
template <typename T> Array<T>& Array<T>::init(int n)
{
delete[] arr;
create(n, n, 0);
return *this;
}
template <typename T> Array<T>& Array<T>::pushFront(T a)
{
if (begin == 0)
{
T* temp = arr;
create(size + length() / 2 + 1, length(), begin + length() / 2 + 1);
for (int i = 0; i < length(); i++)
{
arr[begin + i] = temp[i];
}
delete[] temp;
}
--begin;
arr[begin] = a;
return *this;
}
template <typename T> Array<T>& Array<T>::pushBack(T a)
{
if (end = size)
{
T* temp = arr;
create(size + length() / 2 + 1, length(), begin);
for (int i = begin; i < end; i++)
{
arr[i] = temp[i];
}
delete[] temp;
}
arr[end] = a;
++end;
return *this;
}
template <typename T> T Array<T>::popFront()
{
if (begin > length())
{
T* temp = arr;
int temp2 = begin;
create(size - begin, length(), 0);
for (int i = 0; i < length(); ++i)
{
arr[i] = temp[temp2 + 1];
}
delete[] temp;
}
if (length() > 0)
{
++begin;
}
return arr[begin - 1];
}
template <typename T> T Array<T>::popBack()
{
if (size - end > length())
{
T* temp = arr;
create(end, length(), begin);
for (int i = begin; i < end; i++)
{
arr[i] = temp[i];
}
delete[] temp;
}
if (length() > 0)
{
--end;
}
return arr[end];
}
template <typename T> T& Array<T>::operator[](int i)
{
if (i < 0)
{
i = 0;
}
else if (i >= length())
{
i = length() - 1;
}
return arr[begin + i];
}
main.cpp
#include <iostream>
#include <conio.h>
#include "Array.h"
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
int N;
cout << "Введите размер массива: ";
cin >> N;
Array<int>A;
for (int i = 0; i < N; i++)
{
int t;
cin >> t;
A.pushBack(t);
}
for (int i = 0; i < A.length(); i++)
{
cout << A[i] << " ";
}
_getch();
return 0;
}