Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

Smeshan avatar Smeshan 89 Точки

Polymorphism - Exercise: 5. Word

Здравейте,

не мога да си обясня как:

void init() {
        this->commandTransforms.clear();
        for (std::pair<std::string, std::shared_ptr<TextTransform> > p : this->initCommands()) {
            commandTransforms[p.first] = p.second;
        }
    }

събира всички видове трансформации? Как върти в контейнер-фунцкия и как тази контейнер-функция знае да мине и събере всички видове резултати на тази функция от всеки override? При мен command Transform винаги ми стои с size 1 с този uppercase трансформ, който си идва със скелета.

Направил съм extended версия на commandinterface, в която съм задал override на initCommands(); но аз не виждам как изобщо в init() се знае за тези override и от там да пълни в един и същ вектор от команди, но от различни функции на обекти.. И от там винаги в handleInput-а ми гърми при invokeOn, тъй като изобщо нямам други трансоформации в commandTransforms..

Файловете ми:
CommandInterfaceExtended.h
Initialization.h

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

Илиян

Тагове:
0
C++ OOP 29/08/2021 18:26:32
ditchev avatar ditchev 36 Точки

Здравей, Илиян

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

Създал си CommandInterfaceExtended, но ... кога? ... как? ... дали? го използваш??

Поздрави :))

PS. По отношение на въпроса в първото ти изречение: Погледни какво прави функцията std::map::operator[]

3
29/08/2021 20:13:59
j.petrov_90 avatar j.petrov_90 373 Точки

Привет,

Като видя, че е писал колегата @ditchev и знам, че всичко е 6 :)

Шегата на страна.
Илиян, дадоха ти добри насоки. Опитай се да ги имплементираш и се върни пак да споделиш какво се е получило.

Поздрави

1
Smeshan avatar Smeshan 89 Точки

Ох да.. тотално забравих да направя обект с extended версията.. Благодаря за насоките.

Случих ги тези неща, получавам 40/100, защото сега:

void init() {
        this->commandTransforms.clear();
        for (std::pair<std::string, std::shared_ptr<TextTransform> > p : this->initCommands()) {
            commandTransforms[p.first] = p.second;
        }
    }

подминава uppercase версията на initCommands(), следователно после гърми в handleInput(), тъй като няма такава команда.
Aко закоментирам initCommands() в CommandInterfaceExtended.h, тогава взема само uppercase. И това е логично, защото ако тази фунцкия я няма в подкласа, я взема от основния клас, ако я има, си я взема от там. Но как да я взема и то двете места при пълненето commandTransforms в init()..
Файлове:
CommandInterfaceExtended.h
Initialization.h

Поздрави,
Илиян

1
30/08/2021 14:31:02
Smeshan avatar Smeshan 89 Точки

Добре.. 100/100. Пф, тази беше наистина трудна.

// INIT COMMANDS FUNCTION
    std::vector<Command> initCommands() override {
        std::vector<Command> commands(CommandInterface::initCommands());
        
        commands.push_back(Command("cut", std::make_shared<CutTransform>()));
        commands.push_back(Command("paste", std::make_shared<PasteTransform>()));

        return commands;
    }

Това оправи проблема и все пак ми гърмеше на 2 от тестовете.
И после хванах, че в CutTransform нещо не правя окей с cut-ването и със substr() взе че стана. :)
Благодаря пак и поздрави!
Илиян

1
30/08/2021 18:08:27
j.petrov_90 avatar j.petrov_90 373 Точки

Браво, Илиян!

Задачата наистина е интересна.
Чакай да видиш тези от Abstract Classes (:

Поздрави

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