Как создать функцию декоратора C++ без использования virtual
Я вставлю свой код ниже:
#include<iostream> using namespace std; class Smoothy{ private: int price; public: int getPrice(){ return price; } virtual ~Smoothy() = default; virtual string description() = 0; }; class BasicSmoothy: public Smoothy{ private: string nume; public: BasicSmoothy(string n): nume(n){} string description(){ return nume; } }; class SmoothyDecorator:public Smoothy{ private: Smoothy *b; public: SmoothyDecorator(Smoothy* bb){ b = bb; } ~SmoothyDecorator(){ delete b; } string description(){ return b->description(); } }; class SmoothyWithCream:public SmoothyDecorator{ public: SmoothyWithCream(Smoothy *b):SmoothyDecorator(b){ } string description(){ return SmoothyDecorator::description() + " with Cream!"; } }; class SmoothyWithCinnamon:public SmoothyDecorator{ public: SmoothyWithCinnamon(Smoothy *b):SmoothyDecorator(b){ } string description(){ return SmoothyDecorator::description() + " with Cinnamon!"; } }; int main(){ Smoothy* b = new SmoothyWithCinnamon(new BasicSmoothy("Kiwi")); cout<<b->description(); }
Я реализовал шаблон декоратора, основанный на диаграмме UML. На диаграмме указано, что BasicSmoothy имеет два типа с двумя конкретными ценами(Kiwi 10$, Strawberry 12$), а производные классы добавляют по 2$ и 3$ к окончательной указанной цене.
Что я уже пробовал:
То, что я пытаюсь сделать, - это добавить гладкий объект(киви или клубнику) и добавить сливки или корицу, исходя из этого, моя программа должна вывести окончательную цену. Мой вопрос заключается в том, как бы я добавил или изменил цену, учитывая, что мне не разрешено делать функцию getPrice() виртуальной, а целое число цены является частным. Если бы цена была защищена, ее было бы довольно легко изменить в каждом из производных классов, но поскольку она является частной, я понятия не имею, как ее изменить.
Ценю любую помощь!
Stefan_Lang
Учитывая спецификацию и, самое главное, ограничения, которые у вас есть, нет никакого (чистого) способа установить цену, поскольку нет ни сеттера, ни инициализатора, ни доступа вообще, кроме чтения.
Если вы ищете *любое* решение, независимо от того, насколько оно плохо, вы, конечно, можете сделать некоторые грязные трюки, которые эффективно получают доступ к памяти, удерживающей цену. Но у меня такое чувство, что ты тоже не должен этого делать.
Это похоже на то, как если бы кто-то запер машину, выбросил ключи и попросил вас войти, не разбив окно, замок или вообще какие-либо законы.
Поэтому, пожалуйста, проверьте эту спецификацию и диаграмму UML еще раз, чтобы убедиться, что вы все правильно поняли, или покажите нам эту диаграмму и полные спецификации, чтобы мы могли выяснить, чего вам не хватает. В худшем случае мы можем подтвердить, что это невозможно, и сказать вам, чтобы вы пошли к тому, кто дал вам это задание, и попросили его пересмотреть все (бессмысленные ИМХО) ограничения.