Loading...
Smeshan avatar Smeshan 89 Точки

Exercise - Abstract Classes - Tree

Здравейте,

докарах я до 40/100, но срещам трудности с итерирането в контейнера на shorcuts. Вадя резултат но не в същата последователност както при отговора.

Та, или нещо не го хващам при dynamic cast-a, или трябва да сортирам преди това, или  друго.. и след като пробвах най-различни трансформации и подходи, тотално се оплетох и реших да пиша тук, все пак да мога да успея да я реша преди изпита (а пък и от нея зависи и Explorer задачата).

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

Файл:
TreeView.h

Благодаря предварително!

П.С. гледах някакви стари теми във форума, но не ми помогнаха

Тагове:
1
C++ OOP 06/09/2021 16:43:05
j.petrov_90 avatar j.petrov_90 373 Точки

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

Доста  си усложнил решението си.
Не те виня - задачата не е лесна. Особенно това, че трябва рекурсивен подход.
Като цяло правилно си се сетил, че в един момент ще трябва да сортираш файловете лексикографски.
Въпроса е къде е това място?

Ще се опитам да загатна правилната посока.
getTreeView ти е "входа" към рекурсията. При рекусрията винаги имахме дъно или индикатор кога да спрем да извикнаме функцията. 

std::string getTreeView(const std::vector<std::shared_ptr<FileSystemObject> >& rootObjects) {
	std::ostringstream treeView;

	for (auto root : rootObjects) {
		renderTreeView(root, 0, treeView);
	}

	return treeView.str();
}


А самата функция renderTreeView ще е рекурсията:

void renderTreeView(const std::shared_ptr<FileSystemObject>& root, int levelsIn, std::ostringstream& output) {
	for (int i = 0; i < levelsIn; i++) {
		output << "--->";
	}
	output << root->getName() << std::endl;

	auto asContainer = std::dynamic_pointer_cast<FileSystemObjectsContainer>(root);
	if (asContainer) {
      //some mysterious logic
    }
}


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

0
damyan94 avatar damyan94 9 Точки

Здравейте, и аз имам подобен проблем със сортирането. Закоментираният код е опитът ми да направя тези сортировки на обектите във всяка директория при всяко извикване на рекурсията, подобно на кода, който сортира в main. При откоментиране дава следната грешка:

 

binary '=': no operator found which takes a left-hand operand of type 'const std::shared_ptr<_Ty>' (or there is no acceptable conversion)
 

Има ли начин да се оправи или да се сортира без библиотечната функция sort? Пробвах ръчно сортиране, но съвсем се оплетох в указатели, вектори и компилационни грешки.

 

#ifndef TREE_VIEW_H_
#define TREE_VIEW_H_

#include <memory>

#include "FileSystemObject.h"
#include "ByteContainer.h"
#include "File.h"
#include "FileSystemObjectsContainer.h"
#include "Directory.h"

int count = 0;

/*bool sortFunction(std::shared_ptr<FileSystemObject> a, std::shared_ptr<FileSystemObject> b)
{
	return a->getName() < b->getName();
}*/

void recursive(const std::shared_ptr<FileSystemObject>& object, std::string& treeView)
{
	if (FileSystemObjectsContainer* directory = dynamic_cast<FileSystemObjectsContainer*>(&(*object)))
	{
		count++;
		
			//std::sort(directory->begin(), directory->end(), sortFunction);

		for (auto obj : *directory)
		{
			for (int i = 0; i < count; i++)
				treeView += "--->";

			treeView += obj->getName();
			treeView += '\n';

			recursive(obj, treeView);
		}
	}
}

std::string getTreeView(std::vector<std::shared_ptr<FileSystemObject>>& rootObjects)
{
	std::string treeView;

	for (auto& object : rootObjects)
	{
		count = 0;
		treeView += object->getName();
		treeView += '\n';

		recursive(object, treeView);
	}

	return treeView;
}

#endif // !TREE_VIEW_H_

 

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