Loading...

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

Jovanna avatar Jovanna 186 Точки

C++ advanced Task 3 - Order

Здравейте,

В main()  се създава обект от тип OrderedInserter с празния вектор:

    vector<const Company*> companies;  OrderedInserter inserter{ companies };

 

//CHECK-а ми (вкаран в четящия входни данни цикъл) работи и принти подредени възходящо обектите (така съм разписала класа):
        cout << inserter.getInfo() << endl; 

но, за извеждането на резултата, в main()  се обхожда companies, който е празен и само инициализира обекта в кода.

Как да се изведат обектите, като ако пипна main(), системата ще го презапише?

Благодаря.

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

Здравей,

Правилно си видяла, че OrderedInserter получава празен вектор, който по-късно се обхожда и печата.

Също така на OrderedInserter му се вика insert определен брой пъти преди да бъде обходен и разпечатан вектора.

Съответно какво трябва да прави insert? Името му подсказва. И как можеш да приемеш като параметър вектора така, че да можеш да insert-ваш в оригинала от main през OrderedInserter?

Ако някой ти каже къде живее, и след това почне да си купува неща от магазина и да ти ги дава, и после отиде до неговото вкъщи и потърси тези неща, ти какво трябва да си направила през това време, че да ги намери тези неща?

Толкова мога да ти подскажа без да ти издам решението.

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

Поздрави,

Жоро

2
Jovanna avatar Jovanna 186 Точки

Благодаря!

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

 

По втория въпрос: тогава каква ни е гаранцията, че елементите на вектора ще са последователни в паметта?

А ако създадем по същия начин масив от елементи?

Поздрави!

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

Елементите на един вектор винаги са последователни в паметта, защото под вектора реално има скрит масив. Но мисля, че това което всъщност искаш да питаш е, "каква е гаранцията, че Company обектите са последователни в паметта, щом се заделят поотделно" - отговорът е: никаква, и не ни трябва тази гаранция.

Във вектора нямаме Company обекти - имаме указатели към Company обекти (Company*). Тоест на последователни места в паметта, сме записали адресите на други места в паметта.

Все едно ако аз в една тетрадка напиша на последователни редове адресите (град, улица, етаж...) на всички студенти в курса. Редовете текст, които съм написал, са едно след друго в пространството, обаче самите апартаменти/къщи, за които се отнасят, изобщо не са "последователни" в пространството. Затова ако искам накрая на програмата да изгоря къщите на всички студенти (не че имам такива желания :D), трябва да погледна всеки един адрес в тетрадката, да отида на него физически, и да изгоря самото място - for (Company* companyPtr : companies) { delete companyPtr; }, а не да изгоря самата тетрадка (грешно - delete companies;)

Ако обаче companies беше масив от елементи, динамично заделен така:

int numCompanies = 10; Company* companies = new Company[numCompanies];

Тогава да, самите Company обекти ще са последователни в паметта, като companies[0] ще е първият, companies[1] вторият и т.н. - това е все едно се хващаме да построим една улица с къщи и да настаним всички студенти от курса в тях - тогава адресите на студентите наистина ще са "последователни" в пространството. Случая с вектора пък е все едно им строим къщите по различни времена и си ги записваме в една тетрадка, и понеже ги строим по различни времена, местоположенията им не са последователни.

Надявам се, че всъщност това да питаше, ама ако не - питай пак :D

Поздрави,

Жоро 

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