powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ template dynamic array
6 сообщений из 6, страница 1 из 1
C++ template dynamic array
    #37788709
scymaks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

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

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

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
C++ template dynamic array
    #37788716
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>delete items;
А разве не delete[] items?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
C++ template dynamic array
    #38425207
noob c++
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
scymaks, для чего у тебя переменная capacity? Просто вот дали задание зделать клас строк(по сути это тоже будет массив) так я думал обойтись указателем на массив char и простой интовой переменной, которая будет хранить размер массива...
...
Рейтинг: 0 / 0
C++ template dynamic array
    #38425343
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noob c++scymaks, для чего у тебя переменная capacity? Просто вот дали задание зделать клас строк(по сути это тоже будет массив) так я думал обойтись указателем на массив char и простой интовой переменной, которая будет хранить размер массива...Можно и так решить. Но в этом случае ты будешь подращивать массив на каждое добавление нового элемента. Это возможно, но долго. А используя вспомогательную переменную capacity ты сможешь увеличивать массив не на каждом элементе, а блоками по нескольку элементов. Быстрее работать будет.
...
Рейтинг: 0 / 0
C++ template dynamic array
    #38425976
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем T value ещё оборачивать в структуру?
...
Рейтинг: 0 / 0
C++ template dynamic array
    #38425978
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scymaks, обычно в таких классах виртуальный Деструктор не нужен, классы такие вообще не полиморфные.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ template dynamic array
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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