Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият.
Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание.
Използваме бисквитки и за измерване на маркетинговите ни усилия.
здравейте!
отворена тема, с подходящо за въпроса ми заглавие, затова ще питам тук. за въпросната първа задача - какво се предполага, че трябва да прави метода "void changeLine(const string& line);". препрочитам условието пак и пак и не схващам какво се продполага че трябва да напиша, отговарящо на това име? вторият въпрос - някакви ограничения относно const и по-специално референциите с които очевидно може да декларираме конструктори (пак както е показано в условието)? да разбирам че все едно си е нормална функция и да си използвам референции, навсякъде където мога, с цел забързване на програмата?
Благодаря предварително!
Здравей,
На първия ти въпрос - changeLine просто сменя нещото, което LineParser-а parse-ва. Примерно ако имаш няколко реда числа, вместо да създаваш нов LineParser за всеки от тях, можеш да създадеш само един и да му казваш .changeLine() за всеки нов ред.
На втория въпрос - методите трябва да са точно такива, каквито са в условието. Ако параметърът е const &, значи и при теб трябва да е така - какво ще правиш с така получения параметър в тялото на методите е твое решение. Идеята тук е както да упражните различните начини за работа с конструктори, референции и т.н., така и да сте подготвени ако ви се наложи да ползвате библиотеки, които имат такива изисквания (примерно в STL има изисквания за някои от параметрите на определени методи, когато искаш да ползваш твой клас с някой контейнер, например priority_queue).
Поздрави,
Жоро
дааа, има логика :D:D толкова време го мислех, а то е напълно логично, благодаря!
да, нов въпрос. още по време на лекцията, колега попита дали при обявяването на x(x) с двете точки преди бодито на конструктора може да използваме this->. жоро пробва и видяхме че даде някаква грешка и уточнихме че този this-> трябва да го използваме вътре във методите и конструкторите. НО, следната грешка: в самия клас, името на стринга който използвам (подавам към стринг стрийма) ми е "line". метода "void changeLine(const string& line);" има параметър "line", следователно ще е добра идея да използвам this->. НО, вътре в метода this->line = line; работи, докато line(line) и this->line(line) дава грешка. в демото предоставено от лектора примера си е с this->line=line (е, не е line, ами number, age и тн). въпроса ми е - когато използваме this->, x(x) е невалиден синтаксис винаги или? и защо line(line) не работи вътре в тялото на този метод, но подобни присвоявания си работят при конструкторите, когато ги правим там с двете точки преди бодито?
ако не се разбира въпроса ми, кажете, не знам колко добре се изразих.
Не съм напълно сигурен, че те разбрах, но все пак ще се опитам да ти отговоря :D
Синтаксиса на initializer list - в твоя случай line(line) - може да се ползва само при ... drumroll ... инициализация :D! Инициализацията на членовете на един клас се случва в конструктора. Затова ако се опитваш да го ползваш в някой метод (който може да бъде викнат когато и да е по време на живота на обекта), C++ ти мрънка, че се опитваш да инициализираш нещо, което вече е инициализирано (или нещо подобно ще ти казва грешката).
Това важи и за "нормален" C++ код, например в main функцията:
Тези неща нямат нищо общо с this, не се бъркай, че едното пречи на другото.
А причината да не можем да ползваме this-> в initializer list-а, когато пробвахме по време на лекцията, както си спомняш, е че просто не можем да пишем this извън тялото на метод. Тоест, синтаксиса на езика е просто такъв.
Обобщено:
- initializer list е специален синтаксис, който може да ползваш само с двуеточие след конструктор (преди тялото му)
- this-> можеш да ползваш само в тялото на (non-static) методи
- инициализация (int x(3);) и присвояване (x = 3;) са две различни неща, като инициализацията може да се случи само веднъж, а присвояването може да стане колкото си искаш пъти (стига да x да не е const)
- не можеш да инициализираш членове на класове в тяло на метод (в тяло на конструктор също), защото тяхната инициализация се случва в initializer list-а на конструктора (не в тялото на конструктора), дори и да нямаш написан някой член в initializer list, той се инициализира по подразбиране.
- Но в тяло на метод (или конструктор) можеш да им правиш assignment, тоест да им казваш "= something" на което и да е поле или променлива
- Нищо не ти пречи в тяло на метод да си направиш локална променлива, която инициализираш чрез скобите, но не можеш да го правиш за поле, защото - отново - то вече е инициализирано
да, разбрал си ме и отговора ти ми обясни много неща, благодаря много!!!!
Не мога да се ориентирам в условието. Първо се казва, че "класът приема стринг...", но доколкото разбирам идеята за класове, те приемат обекти; а после са дадени такива редове в тялото на класа:
IntSmartArray getNumbers() const;
StringSmartArray getStrings() const;
...
Какъв е този синтаксис? Какво е отношението на масивите (!?) към функциите/методите? Защо са на един ред без никакви знаци помежду си?
Под "класът приема стринг" се има предвид, че когато създаваш обект от този клас, на конструктора му подаваш обект от тип string. Затова е даден и примерен код с точно такъв конструктор. Един вид от твоя клас се очаква да работи с някакъв конкретен обект от тип string, това се има предвид в условието.
После като викаш съответните методи на класа, те трябва да обработят този string и да го преобразуват съответно в масив от int-ове или масив от string-ове.
Няма нищо обобено в този синтаксис, IntSmartArray и StringSmartArray са просто някакви измислени класове, които представляват масив от int-ове и масив от string-ове. По време на лекциите написахме един SmartArray клас, който работеше с int-ове - затова и текста преди примерния код казва "ако решите да ползвате SmartArray...". Ако искаш може методите ти да връщат и vector<int> и vector<string> съответно, или по някакъв начин да връщат масив - но при всички положения трябва някак да върнат елементите, които са били обработени (parse-нати) от string обекта, който е бил подаден на конструктора.
Виж примерите, които съм дал по-нагоре в коментарите.
Поздрави,
Жоро
T.e. методите се отнасят за всеки обект поотделно? И не е нужно да пълнят масивите с инт-овете на всички въведени обекти? Така всеки обект ще има своя отделен инт-масив?
Ако са класове, то валидно ли е да създаваме техни обекти в синтаксис за функция?
Класът си има методи. Тези методи се викат върху обекти от класа. Това е цялата идея на не-static методите, като викнеш един такъв метод на един обект, този метод да се изпълни само за този обект. Като имаш един string s; и на него му кажеш s.find("...") или s.size(), това не работи върху всички string обекти създавани някога, а върху конкретния string s;.
Иначе, разбира се че можеш да създаваш обекти от един клас във функция (метод) на друг клас. string също е клас, можеш да си създаваш обекти от него в main(), можеш да го връщаш и т.н.
Мисля че трябва да прегледаш наново лекцията за ООП, там сме ги говорили тези неща.
олелеее... наистина така задачата е лесна... а аз се чудех как да обединя всички инт-масиви в един резултантен...
Да, но за обект задаваме само име. Можеш ли да ми обясниш какво създаваме така (кое е името на обекта?):
IntSmartArray getNumbers() const;
Не създаваме обекти с тази декларация. С това само казваме, че има метод getNumbers в този клас, който връща обект от тип IntSmartArray (и освен това този getNumbers не променя текущия обект, заради const думата). Това не е цялата функция, това е само декларация на функция, спомни си в първата лекция как можехме да декларираме функция на едно място, а на друго да я дефинираме (да ѝ напишем тялото). В тялото на тази функция, което ти трябва да напишеш, ще създадеш обект, на който можеш да му дадеш име, и ще го return-неш. Дадена ти е само декларацията, а от теб се иска спрямо тази декларация да напишеш имплементация, това е част от задачата.
В 5-та лекция (тази за Code Organization) можеш да видиш подробно обяснение на това разделение на декларация и дефиниция, когато става дума за класове.
Благодаря за отговорите!
Не исках да занимавам форума с минали неща, но не ми беше ясно. Навсякъде за тази задача пишат, че това са масиви, а не декларация на функция/метод, която връща обекти на класовете IntSmartArray и StringSmartArray (създадени като варианти на smart-array класа). Май и на други не им е съвсем ясно... дано е от полза и за други и съжалявам, че ти губя времето за минали неща.