Loading...
peter.gaydeek avatar peter.gaydeek 2 Точки

C++ Advanced - 04.Tree. getTreeView функцията

Колеги моля ви се какво трябва да правя с тази функция "std::string getTreeView(std::vector<std::shared_ptr<FileSystemObject>> rootObjects)" от 4 задачка от домашното...нещо не мога да я схвана може ли някой да ми обясни какво точно трябва да се направи?? 

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

Привет,

Една от най-често използваните структури данни в света е дървото (tree на английски).

Ако ти е интересно можеш да прочетеш тази статия:
https://www.tutorialspoint.com/data_structures_algorithms/tree_data_structure.htm

Ако не ти се чете:
То поне виж какво представлява дървото като картинка.
Всяко дърво си има корен (най-горния елемент).
Като работим с дървета винаги държим връзка към корена му(защото от него можем да достигнем до всеки един друт елемент на дървото).

Файловите системи се реализират като дърво.

В задачата фунцията:
std::string getTreeView(std::vector<std::shared_ptr<FileSystemObject>> rootObjects)
за която питаш: има за цел да "нарисува" дърветата каго ги напълни в един std::string.
Как точно става това? -> описано е във задачата.

Обърни внимание, че функцията ти комбинира няколко файлови дървета в един std::string.

Поздрави

 

1
peter.gaydeek avatar peter.gaydeek 2 Точки

Привет,

 

Благодаря за инфото, написах кода, но имам само 1 проблем...не иска да влезе във [Shortcut] и само ми изписва името като папка

и след това отива на следващата, а самите неща които са shortcut не ми ги изкарва... ще напиша само как започнах кода за да не си изпращам цялото решение :

std::string getTreeView(std::vector<std::shared_ptr<FileSystemObject>> rootObjects)
{
    for (size_t i = 0; i < rootObjects.size(); i++)
    {
        std::shared_ptr<FileSystemObject> currPtr = rootObjects[i];
        std::shared_ptr<Directory> directory = std::dynamic_pointer_cast<Directory>(currPtr);
...........

}

 

как мога да изкарам Shortcut-ите ? Ако може малко помощ : )

 

П.П.

Много е вероятно пак да не съм задал въпроса както трябва, но явно не ме бива в тези неща :D

извинявам се за което !

Поздрави! 

0
j.petrov_90 avatar j.petrov_90 373 Точки

Привет,

Правилно подхождаш.
Не ти "влиза" в shortcut-ите, защото не му казваш да "влиза".
- Това няма как да стане на 1 стъпка, а става на няколко.
- Обхождаш всичко на моментното ниво;
- "Влизаш" надолу във всяка папка и повтаряш горната стъпка;
- Повтаряш докато не остат файлове/папки.

Подсказка:
Това обикновенно се прави с рекурсия.

Малко жокери можеш до ползваш и темата на колегата за същата задача:
https://softuni.bg/forum/26204/09-cplusplus-oop-pure-virtual-members-and-multiple-inheritance-task-4-tree

Само внимавай, че теб те пренасочвам натам, а него го пренасочвам на тук. Да не стане някоя безкрайна рекурсия и да гръмне със stack overflow :)

Поздрави

0
peter.gaydeek avatar peter.gaydeek 2 Точки

Привет отново,

 

май не се разбрахме. Проблема ми е че когато кастна това:

 std::shared_ptr<Directory> directory = std::dynamic_pointer_cast<Directory>(currPtr); ми връща nullptr на Shortcuts това означава, че не мога да "влезна" по навътре! 
Ето какво ми принтира за по-добро обяснение :


[shortcuts]
examples
--->example.txt
--->nested
--->--->noDot
--->--->otherFile.txt
rootDir
rootFile.txt

Въпросът ми е дали бъркам някъде във getTreeView функцията или някъде другаде. Класа Directory ми наследява FileSystemObject и FileSystemObjectsContainer каквито наследява и класа Shortcut. За момент си помислих да не е от там, но няма как понеже ако е друго програмата гърми. Не мога да кастна std::dynamic_pointer_cast към Shortcuts понеже конструктора не позволява...къде бъркам не мога да разбера :( 
Когато започна да дебъгвам проверявам да не би преди да влезе във функцията getTreeView  да липсват елементите във Shortcuts, но всичко е там ...използвам рекурсия в задачата.

 

Поздрави!

 

0
ditchev avatar ditchev 36 Точки

Здравей, колега,

както сигурно предполагаш, си на няколко милиметра от решението :))

Ще се опитам да ти дам жокер, без да ти давам готовото решение, дано успея:

Представи си, че си пред сергия на пазар. На тезгяха има картофи, лук, боб, домати, ябълки и круши. Ти в момента казваш: може ли да опитам от ябълките и се чудиш, защо не ти предлагат да опиташ и от крушите :)) След теб идва едно хлапе, казва нещо (търсеното решение) и му дават да опита една ябълка и една круша :))

Поздрави!

1
peter.gaydeek avatar peter.gaydeek 2 Точки

Мерси колега, но от това разбирам какво искаш да ми кажеш и единственото което ми остава в главата след този коментар е да си купя ябълки, защото ми се приядоха :D ! А относно задачата си оставам на същото място... :(

0
ditchev avatar ditchev 36 Точки

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

Сърце не ми дава да ти дам готовото решение, на милимунда си от него ..

Дай да пресъздадем разговора с продавача на сергията: ти му казваш:

- Може ли да опитам от ябълките?

той ти подава една ябълка а ти си говориш наум:

"Тоя защо не ми даде и от крушите, нали и двете са плодове ...?"

и се гледате дълго, втренчено и замислено ...:)))

0
j.petrov_90 avatar j.petrov_90 373 Точки

Колегата ditchev ти даде godlike жокер.
Адмирации за добрия пример.

Ако преобразуваш неговото предложение в код ще се получи.

Допълвам и аз с още жокери:
- Правилно си се сетил, че ще трябва за ползваш std::dynamic_pointer_cast<>;
- Грешно си подходил към какво да кастваш.
Ако кастна ябълката към круша - нормално да ми даде nullptr (неуспешен каст).

По-здрави

0
peter.gaydeek avatar peter.gaydeek 2 Точки

То се е видяло че нищо не разбирам и тази задача няма да я реша...а пък за следващата да не говорим... Кастнах го към какво ли не което може да се кастне и не става не ми дава....когато го кастна към Shortcuts дори не ми тръгва и изкарва :
  'std::shared_ptr': no appropriate default constructor available   

 'std::shared_ptr': 'Shortcuts' is not a valid template type argument for parameter '_Ty'   

 'std::dynamic_pointer_cast': no matching overloaded function found    

  'std::dynamic_pointer_cast': invalid template argument for '_Ty1', type expected   

 'Shortcuts': undeclared identifier  

а трябва да го кастна към нещо което има Iterator-и за да може после да "влизам по навътре" а iterator-и имат само Directory и Shortcuts поне при мен...

.....изгледах лекцията сигурно 40 пъти + форуми в интернет + клипове в Ю туб  и още какво ли не ...
Май не схващам материала, което е много лошо, защото отделям много време и щом това не ми стига за да схвана материала много лошо... :((


 

0
j.petrov_90 avatar j.petrov_90 373 Точки

Няма страшно, стига се напряга.

Хиляда пъти съм го казвал - курса е труден!
Човек трябва да се потруди, докато му се получи.
Повярвай ми за мен е по-ценно, че съм те научил да ти пука и да искаш да го разбереш! Другото ще си дойде с времето.
Нещо може да го разбереш от 5я път, но важното е, че ще го разбереш.
Ако беше някой, на когото не му пука ... и да ти го наливам с фуния в главата - пак нямаше да стане.
Давай по-ведро и гордо вдигната глава :)

Относно задачата:
Мисли как се използва полиморфизъм...
- Правим базов клас (често той е абстрактен). 
- Правим контейнер от pointer-и към базовия клас като го пълним с обекти, които седят по-надолу в йерархията на наследяването.
- Използваме полиморфизмът като извикваме функциите на базовия клас.

Еми същото е и тук.
За да имаш полиморфизъм ти трябва базовия клас!
Кой е базовия клас, който може да съдържа файлове?
Ами ... FileSystemObjectsContainer.
Има ли той в себе си начин да достигнеш до отделните файлове? Има, разбира се -> има 2 виртуални функции за begin и end iterator-и.

Заключението е, че в std::dynamic_pointer_cast<> трябва да кастваш към FileSystemObjectsContainer и от там нататък вече да си "отпечаташ" дървото.
Пак напомням само, че това не става на 1 ред. Дърво най-лесно се обхожда с рекурсия.

Поздрави

0
peter.gaydeek avatar peter.gaydeek 2 Точки

Много ти благодаря! Дано друг път когато ми трябва не съм така забил....бях пробвал да кастна към базовия клас, но се оказа че от там надолу ме се счупила логиката, но успях де! Със 120943249 въпроса във форума :D Благодаря и на 2-ма ви! 
Поздрави!

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