Программа останавливается при вызове конструктора, c ++

0

Это мой первый раз с использованием шаблонов, и по какой-то причине моя программа перестает работать с сообщением, в котором говорится, что "проблема заставила программу правильно работать". Я не знаю, что вызывает это.

Здесь главное:

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);
}
Теги:
templates

2 ответа

8

Здесь вы создаете массив размера (!) Размера:

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.

2
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])
{ }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню