Loading...
niagara avatar niagara 22 Точки

C++ Advanced - 07. Destructors, Constructors and Copy Assignment - Task 1 - Register

Здравейте, осъзнавам, че сигурно е очеизвадно, но в момента съм напълно забила и не мога да разбера, защо ми гърми кодът и по - точно add метода: https://pastebin.com/JSQjZxu3   Моля някой да ми разясни. Благодаря предварително.

Тагове:
0
C++ Programming
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки
Best Answer

Здравей,

Провери ли стойностите на полетата на обекта, когато гръмне add метода? С кои променливи/полета работиш в add метода и какви могат да бъдат стойностите им, за да гръмне? На кое изпълнение на този add метод гърми, на първия ли? Ако е на първия, какво ти казва това за състоянието на обекта? Коя част от кода е отговорна за задаването на началното състояние (стойности на полета) на един обект?

Пробвай да си отговориш на тези въпроси и мисля, че ще се ориентираш къде е проблемът. Ако нещо те спъва, пиши пак :)

Поздрави,

Жоро

0
niagara avatar niagara 22 Точки

Предполагам, че проблемът идва от конструктора и по точно стойността на companiesArray, но какво трябва да е първоначалното му състояние не съм сигурна.

0
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Правилно - companiesArray не е инициализиран, и като се опитваш да достъпиш елемент на определен индекс, получаваш грешка (по-точно недефинирано поведение), защото достъпваш памет, която не е твоя.

Значи това поле companiesArray е указател, който се ползва като масив. Целият проблем е в това, че този масив не е инициализиран - не е заделена памет за него. Ти даже знаеш, че това трябва да е масив, защото правилно го освобождаваш в деструктора - delete[] companiesArray. Щом така го освобождаваш, как трябва да го заделиш в конструктора? Размерът му също го знаеш - затова имаш параметър в конструктора за броят компании, ако видиш как се ползва класа, ще видиш, че това число е общата бройка компании, които ще бъдат прочетени.

1
niagara avatar niagara 22 Точки

Забила съм тотално. Знам, че структурата за масив е: new T[size] {initializer list}, но не знам какво да правя с инициализационния списък:

Company* companiesArray = new Company[numCompanies] {};

0
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Не ти трябва инициализационният списък - той се ползва само ако искаш да дадеш някакви начални стойности. Ти не искаш да даваш, искаш просто да заделиш паметта, в която по-късно ще добавяш чрез add метода. Тоест просто искаш this->companiesArray = new Company[numCompanies]; в конструктора.

Оттам нататък уловката на задачата е, че не ползваш id-то на компанията за индекс (защото id-то може да е всякаква стойност, а ти искаш последователни индекси, по-малки от заделената памет), а ползваш numAdded - заделяш паметта с numCompanies, обаче numAdded го почваш го от 0 (в конструктора) - то ти е индекса за следващата компания, която се добави. Тоест при add добавяш компанията на индекс numAdded, и увеличаваш numAdded. Това и казва името на тази променлива - това е броят добавени компании "към момента", не е общият брой компании, които ще бъдат добавени.

1
niagara avatar niagara 22 Точки

Много благодаря! Извинявам се, че те занимвам с толкова прости неща

0
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Е, няма проблем, затова съм тук. Не е толкова просто, заради уловката, кара те да мислиш, че бъркаш едно нещо, докато всъщност друго ти прави проблем (индексацията в случая). Затова е хубаво ако забиеш на някоя задача да подхванеш друга и да се върнеш по-късно на тази. Или да се опиташ да подходиш по различен начин към решението - обикновено ако привидно проста задача стане сложна, най-вероятно нещо предполагаш грешно някъде и трябва да премислиш цялото решение.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.