Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

Smeshan avatar Smeshan 89 Точки

Exercise - Special Class Members - 5. Register

Здравейте,

доста се поблъсках с тази задача и мисля, че изобщо не мога разбера какво се изисква от мен, че да го направя. 

Разсъжденията ми са:
1. Трябва да позлвам companiesArray да сочи към array от обекти Company с големината, която ми се дава през конструктура? Ако това е така, то това, което правя не работи и array винаги си остава с size 1.

Register::Register(size_t numCompanies) {
	companiesArray = new Company[numCompanies];
	//companiesArray = (Company*)malloc(sizeof(Company) * numCompanies);
}

2. После с member-a add да добавям компании, което не мисля, че има нещо сложно тук.. и все пак може да грешно?

void Register::add(const Company& c) {
	companiesArray[numAdded] = c;
	numAdded++;
}

3. И накрая с get да намирам тази компания и да я изписвам, за което правя това:

Company Register::get(int companyId) const {
	for (size_t i = 0; i < numAdded; ++i) {
		if (companiesArray[i].getId() == companyId) {
			return companiesArray[i];
			break;
		}
	}
	//return ERROR;
}

Отговора ми излиза но judge ми дава 0/100 с Runtime error на всичко.
Пробвах с static контейнер най-горе, в който да записвам компаниите, но тогава пък изобщо не позлвам пойнтъра заложен в header-a (освен, че и не отново не успявам да го накрам да сработи)..
И мисля, че или тотално се бъркам нещо, или не разбирам условието.. :?

Целият код: Register.cpp

Много ми се иска да знам и разбирам как се решава тази задача, и за това предварително съм благодарен за отделеното време.

Поздрави,
Илиян

Тагове:
0
C++ OOP
j.petrov_90 avatar j.petrov_90 373 Точки
Best Answer

Привет, Илиян,

Задачата не е лесна, не е и трудна. Успял ди обаче да се спънеш, да се затреляш в крака и да си отсечеш главата на гилотината :D
Споко, затова сме тук - да се научим. Благодаря, че пишеш във форума за помощ.

@Kristalin05, за жалост това, което предлагаш не е вярно.
Колегата не е include-нал Company.h, но пък има Register.h, което в себе си носи Company.h
Ако наистина не го беше include-нал - то тогава програмата му изобщо нямаше да се компилира.
Т.е. щеше да има compile time error, а не run-time error.

Илиян ще започва от малките неща и ще оставя същинския проблем за финал.

1) В пристъп на беизходица си посегнал към static контейнер. Това няма нищо общо със задачата.

2) Също така си решил да пробваш C функциите malloc и free. В тях няма нищо лошо, просто знай, че те не "работят добре" с OOP-то. В С няма ООП и респективно тези функции просто заделят и освобождават памет.
Казано по друг начин new/delete освен да заделят и освободят памет - ще викнат съответния конструктор/destructor на обекта, върху който работиш.

3) В линка, койти си дал виждам следния код:

Register::~Register() {
	/*
	for (int i = 0; i != numAdded; ++i)
	{
		delete companiesArray[i];
		companiesArray[i] = nullptr;
	}
	*/
 
	delete[] companiesArray;
	companiesArray = nullptr;
}

Коментирания код си е направо грешен. Трябва да го изтриеш. Вече имаш динамичен масив от компании в мембъра ти "companiesArray".

4) Учили сме, че винаги винаги винаги една non-void функция трябва да завършва с return statement, колкото и невероятно да звучи control flow-a да стигне до там.
При теб:

Company Register::get(int companyId) const {
	for (size_t i = 0; i < numAdded; ++i) {
		if (companiesArray[i].getId() == companyId) {
			return companiesArray[i];
			break;
		}
	}
	//return ERROR;
}

Ако не намерим компания - програмата ти директно ще крашне. Бонус: щом имаш return, нямаш нужда от break.
Какво трябваше да направиш:

Company Register::get(int companyId) const {
	for (size_t i = 0; i < numAdded; ++i) {
		if (companiesArray[i].getId() == companyId) {
			return companiesArray[i];
		}
	}
    std::cerr << "Error, company with Id: " << companyId << " not found" << std::endl;
	return Company();
}


5)  И сега същинския проблем ... каква е стойността на "numAdded" в твоята програма?
...
Тя не е инициализирана! :)
Ти не я зануляваш в конструктора, инкрементираш я, когато има произволна стойност.
Още по-опасно на база на нея достъпваш чужда памет, което води и до run-time грешката.

Поздрави,
Живко

1
09/08/2021 11:10:47
Smeshan avatar Smeshan 89 Точки

Много благодаря!
Стана вече 100/100 :)
Аз в един от опитите я бях инициализирал, но впоследствие съм я затрил и тотално съм я збаравил, и си мисля, че е там и си върши работата.. Но ако header-a беше мой още там щях да я зануля.
Останалите неща също ги оправих.

Но се радвам, че правилно съм разбрал, какво трябва да се направи, но ще трябва да се решават повече задачи!

Поздрави,
Илиян

0
Kristalin05 avatar Kristalin05 1 Точки

Нямаш include-нат Company.h и заради това judge ти вади runtime error на всички тестове.

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