Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ template dynamic array / 6 сообщений из 6, страница 1 из 1
11.05.2012, 06:53
    #37788709
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++ template dynamic array
Добрый день!

Проблема следующая есть.... Никак не могу понять в чем дело. Есть вот такой вот код.

Вкратце, это простейшая реализация динамического массива с функциями добавления в начало / в конец и удаления с начала / с конца, получить размер массива, плюс два оператора обращения по индексу. Проблема начинается, когда возникает код какого-нибудь такого вида:

CArray<std::string> a; // компилится, но во время исполнения начинает отображать пустой черный экран. Дебагом проходится конструктор и выходит из него, более того, даже заходит в деструктор, а потом начинает "виснуть". В чем проблема может быть? Наверно реализацию я выбрал некорректно. Подскажите, в чем ошибка может быть, пожалуйста


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
#include <iostream>
using std::cout;
using std::endl;

template<class T>
class CArray {
	struct Item {
		T value;
	};

	Item * items;

	int size;

	int capacity;

public:
	CArray() {
		capacity = 1;

		items = new Item[capacity];

		size = 0;
	}

	CArray(const CArray<T>& a) {
		if (this != &a) {
			capacity = a.GetSize();

			items = new Item[capacity];

			size = 0;

			for (int i = 0; i < a.GetSize(); i++) {
				PushToEnd(a[i]);
			}
		}
	}

	virtual ~CArray() {
		delete items;
	}

	CArray& operator=(const CArray& a) {
		if (this != &a) {
			delete items;

			capacity = a.GetSize();

			items = new Item[capacity];

			size = 0;

			for (int i = 0; i < a.GetSize(); i++) {
				PushToEnd(a[i]);
			}
		}
	}

	void PushToBegin(const T& value) {
		if (size == capacity) {
			int newCapacity = 2 * capacity;

			Item * buffer = new Item[newCapacity];
			
			for (int i = 0; i < size; i++) { buffer[i] = items[i]; }

			delete items;

			capacity = newCapacity;

			items = new Item[capacity];

			for (int i = 0; i < capacity; i++) { items[i] = buffer[i]; }

			delete buffer;
		}

		for (int i = size; i >= 0; i--) {
			items[i] = items[i - 1];
		}

		items[0].value = value;

		size++;
	}

	void PushToEnd(const T& value) {
		if (size == capacity) {
			int newCapacity = 2 * capacity;

			Item * buffer = new Item[newCapacity];
			
			for (int i = 0; i < size; i++) { buffer[i] = items[i]; }

			delete items;

			capacity = newCapacity;

			items = new Item[capacity];

			for (int i = 0; i < capacity; i++) { items[i] = buffer[i]; }

			delete buffer;
		}

		items[size].value = value;

		size++;
	}

	void RemoveFromBegin() {
		if (size > 0) {
			for (int i = 0; i < size; i++) {
				items[i] = items[i + 1];
			}

			size--;
		}
	}

	void RemoveFromEnd() {
		size--;
	}

	void Clear() {
		size = 0;
	}

	int GetSize() const {
		return size;
	}

	T operator[](const int index) const {
		///* Выполняем проверку, что индекс корректен */
		//if ((size < 0) || (index >= size)) {
		//	throw IllegalArgumentException("Index must be more then zero.");
		//}

		return items[index].value;
	}

	/*
		Предостовляет доступ к элементу массива, по его индексу в массиве
		@param index индекс элемента массива
		@throws IllegalArgumentException в случае, если (index < 0) или (index >= GetSize())
	*/
	T& operator[](const int index)  {
		///* Выполняем проверку, что индекс корректен */
		//if ((size < 0) || (index >= size)) {
		//	throw IllegalArgumentException("Index must be more then zero.");
		//}

		return items[index].value;
	}
};

template <class T>
std::ostream& operator<<(std::ostream& out, const CArray<T>& a) {
	out << "[";
	for (int i = 0; i < a.GetSize(); i++) {
		out << a[i] << (i == (a.GetSize() - 1) ? "" : ", ");
	}
	out << "]";
	return out;
}
...
Рейтинг: 0 / 0
11.05.2012, 07:36
    #37788716
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++ template dynamic array
>delete items;
А разве не delete[] items?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
12.10.2013, 15:46
    #38425207
noob c++
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++ template dynamic array
scymaks, для чего у тебя переменная capacity? Просто вот дали задание зделать клас строк(по сути это тоже будет массив) так я думал обойтись указателем на массив char и простой интовой переменной, которая будет хранить размер массива...
...
Рейтинг: 0 / 0
12.10.2013, 21:59
    #38425343
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++ template dynamic array
noob c++scymaks, для чего у тебя переменная capacity? Просто вот дали задание зделать клас строк(по сути это тоже будет массив) так я думал обойтись указателем на массив char и простой интовой переменной, которая будет хранить размер массива...Можно и так решить. Но в этом случае ты будешь подращивать массив на каждое добавление нового элемента. Это возможно, но долго. А используя вспомогательную переменную capacity ты сможешь увеличивать массив не на каждом элементе, а блоками по нескольку элементов. Быстрее работать будет.
...
Рейтинг: 0 / 0
14.10.2013, 00:16
    #38425976
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++ template dynamic array
зачем T value ещё оборачивать в структуру?
...
Рейтинг: 0 / 0
14.10.2013, 00:18
    #38425978
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C++ template dynamic array
scymaks, обычно в таких классах виртуальный Деструктор не нужен, классы такие вообще не полиморфные.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ template dynamic array / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]