Я совершенно новичок в C ++ и хотел попробовать создать простой общий (не уверен, что это правильная терминология) класс массива, который по существу работал бы как массивы в java (в основном для удобного поля длины). Вот весь код:
#include <iostream>
template <typename T>
class Array
{
private:
T* ar;
public:
const unsigned int length;
Array(unsigned int length_) : length(length_), ar(new T[length]) {}
void insert(unsigned int, T);
T& get(unsigned int);
T& operator[](unsigned int);
};
template <typename T> void Array<T>::insert(unsigned int index, T dataToAdd)
{
if(index>=length)
{throw -1;}
ar[index]=dataToAdd;
}
template <typename T> T& Array<T>::get(unsigned int index)
{
if(index>=length)
{throw -1;}
return ar[index];
}
template <typename T> T& Array<T>::operator[](unsigned int index)
{return this->get(index);}
int main()
{
std::cout << "main start\n";
Array<int> nums1=Array<int>(2);
nums1[0]=4;
nums1[1]=10;
std::cout << "length of nums1:" << nums1.length << "\n";
Array<int> nums2=Array<int>(2);
nums2[0]=8;
nums2[1]=5;
std::cout << "length of nums2:" << nums2.length << "\n";
Array<int> nums3=Array<int>(2);
std::cout << "nums3 created\n";
nums2[0]=3;
std::cout << "added to index 0\n";
nums2[1]=15;
std::cout << "added to index 1\n";
std::cout << "length of nums3:" << nums3.length <<"\n";
std::cout << "main end\n";
}
Он отлично компилируется (с использованием MinGW), но когда я запускаю его, я получаю следующий вывод:
main start
length of nums1:2
length of nums2:2
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
Поскольку последнее, что печатает cout
, это длина nums2:2, я предполагаю, что исключение выдается в строке после: Array<int> nums3=Array<int>(2);
Что является причиной этого? Я не могу быть вне памяти, не так ли?
Array(unsigned int length_) : length(length_), ar(new T[length_]) {}
- person dragosht   schedule 13.06.2014new
. Итак, вашему классу нужен деструктор, такой как~Array() { delete[] ar; }
- person anumi   schedule 13.06.2014warning: Array<int>::length will be initialized after [-Wreorder]
- person dragosht   schedule 13.06.2014