Loading...
kostadink2001 avatar kostadink2001 7 Точки

C++ Advanced - 09_05.Explorer. Имплементация на paste функцията

Здравейте, 

Имплементирал съм всички функции от задачата без paste и createShortcut. Опитвам се да имплементирам paste функцията, но след като я написах програмата гърми или след извикването й, или след като после извикам cd командата(първият тест кейс гърми след "cd nested"). В самия код на функцията ми ли е проблема или някъде на друго място? Иначе използвам стак за клипбоарда и един пойнтер към FileSystemObjectContainer - currLocation в който пазя текущата директория в която се намира юзерът.

                                                                                    Линк към paste() имплементацията

 

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

Тагове:
0
C++ Programming
MartinBG avatar MartinBG 4803 Точки
Best Answer

Не знам каква ти е останалата имплементация, но освен ако не е нещо много екзотично :), най-вероятно имаш проблем в moveFileAtCurrentLocation метода.

Най-общо казано, paste трябва да прави следните неща:

1. Remove FSObj from old parent

2. Add FSobj as child to new parent

3. Set FSObj parent to new parent

4. Make sure that add/remove from root directory updates root objects reference received from main()

5. Clear clipboard

 

Прегледай си кода и най-вече частта с kidsOfNewParent и kidsOfOldParent.

Защо си правиш vector - копие на "децата", което после манипулираш (т.е. не променяш реалните FileSystemObjectsContainer обекти, ами копие, което после се унищожава)? 

FileSystemObjectsContainer инерфейса има два виртуални метода (add и remove), които направо се молят да бъдат използвани тук ;)

0
kostadink2001 avatar kostadink2001 7 Точки

Редактирах функцията, но проблемът си остава същия. Ето променената ми функция : 

void moveFileAtCurrentLocation(const std::shared_ptr<FileSystemObject>& file)
	{
		std::shared_ptr<FileSystemObjectsContainer> fileParent = std::dynamic_pointer_cast<FileSystemObjectsContainer>(file->getParent().lock());
		std::weak_ptr<FileSystemObject> newParent = std::dynamic_pointer_cast<FileSystemObject>(currLocation);
		file->setParent(newParent);

		currLocation->add(file);

		if(fileParent != nullptr)
		{
			fileParent->remove(file);
		}else
		{
			objects.erase(std::find(objects.begin(), objects.end(), file));
		}
	}

Мисля, че проблемът ми е някъде в navigate функцията(cd командата), може правя нещо грешно с пойнтера и може би когато го пренасочвам към nullptr и програмата работи с него изниква проблем и гърми. Ето кода ми без имплементацията на шорткътите:

https://pastebin.com/cae22z6E

 

0
MartinBG avatar MartinBG 4803 Точки

Прегледах кода набързо. 

getFile както си го написал винаги ще търси започвайки от от root, а трябва да търси само и единствено в current (без да ходи надолу по дървото).

walkInAndFind изглежда странен, но може и да не съм му схванал идеята. В момента търси само съвпадение по име на Directory.

 

Подобни проблеми най-лесно се намират с дебъгване. Стартирай програмата в дебъг режим и виж какво се случва при подаване на различните команди.

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