Это мой первый раз с использованием шаблонов, и по какой-то причине моя программа перестает работать с сообщением, в котором говорится, что "проблема заставила программу правильно работать". Я не знаю, что вызывает это.
Здесь главное:
class point
{
int x;
int y;
public:
point(int abs=0,int ord=0)
{
x=abs;
y=ord;
}
~point(){}
};
шаблон:
template <class T>
class tablo
{
T *adr;
int nelem;
public:
tablo();
~tablo();
T nouvo(T);
T & operator [](T);
};
template <class T>
tablo<T>::tablo()
{
nelem=0;
adr=new T[nelem];
}
template <class T>
tablo<T>::~tablo()
{
delete[] adr;
}
template <class T>
T tablo<T>::nouvo(T var)
{
return adr[nelem++]=var;
}
template <class T>
T & tablo<T>::operator[](T var)
{
return[T]
}
и главное:
#include <iostream>
#include "point.h"
void main()
{
tablo<point> tab;
point a(1,2);
point b(3,4);
tab.nouvo(a);
tab.nouvo(b);
}
Здесь вы создаете массив размера (!) Размера:
template <class T>
tablo<T>::tablo()
{
nelem=0;
adr=new T[nelem];
}
и вы получаете доступ к нему и пишете за его пределами:
template <class T>
T tablo<T>::nouvo(T var)
{
return adr[nelem++]=var;
}
Любая попытка доступа к динамически распределенному массиву нулевого размера - это неопределенное поведение, означающее в значительной степени все, что вы можете сделать безопасно, это delete
вызов на нем и принять его адрес. Смотрите, когда массив нулевой длины ОК?
Обычные массивы не магически растут. Вы можете упростить все, используя std::vector<point>
вместо или в качестве части tablo
.
nelem = 0;
adr = new T[nelem];
Здесь вы назначаете массив нулевого размера, а позже в своей программе вы пытаетесь получить доступ к значениям, превышающим этот размер.
Конструктор по умолчанию должен установить массив в nullptr, и у вас должен быть другой конструктор, который принимает указанный размер:
template <class T>
tablo<T>::tablo()
: nelem(0), adr(nullptr)
{ }
template <class T>
tablo<T>::tablo(int size)
: nelem(size), adr(new T[size])
{ }