Професионална програма
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 372 Точки

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

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

Ще се опитам да загатна правилната посока.
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