Member 13608791 Ответов: 1

Как создать функцию декоратора 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 еще раз, чтобы убедиться, что вы все правильно поняли, или покажите нам эту диаграмму и полные спецификации, чтобы мы могли выяснить, чего вам не хватает. В худшем случае мы можем подтвердить, что это невозможно, и сказать вам, чтобы вы пошли к тому, кто дал вам это задание, и попросили его пересмотреть все (бессмысленные ИМХО) ограничения.

1 Ответов

Рейтинг:
0

Stefan_Lang

Если вы не можете использовать виртуальные функции, то какой смысл использовать шаблон декоратора??

Просто сохраните описание и цену каждого ингредиента в простой структуре и создайте список или std::vector для хранения ингредиентов. Проблема решена.

Если у вас есть конкретная причина использовать шаблон декоратора, пожалуйста, сообщите нам об этом
а) зачем вам это нужно?
(b) почему вы не можете использовать виртуальную функцию?


Member 13608791

Мне разрешено использовать виртуальные функции( string description() является виртуальным), но я не могу сделать функцию getPrice() виртуальной. Единственная причина, по которой я использую шаблон декоратора, заключается в том, что предоставленная мне UML-диаграмма идеально соответствует ему.

У меня есть некоторые ограничения, написанные помимо моей диаграммы:

Я могу использовать только функции и переменные, написанные на диаграмме UML, и я не должен изменять их видимость(делать их защищенными/общедоступными), и я не должен использовать классы друзей. Это означает, что я не могу изменить getPrice() с обычной функции на виртуальную и не могу добавить никаких других функций/переменных, кроме тех, которые перечислены в моем коде.

Насколько я понимаю, должен быть способ назначения цены с помощью конструкторов, но я точно не знаю, как это сделать.

Stefan_Lang

"Я могу использовать только функции и переменные, записанные в диаграмме UML"

Тогда вы должны показать нам эту диаграмму! Я не собираюсь тратить полчаса на написание возможного решения, которое будет работать только для того, чтобы узнать, что вы не можете его использовать.

Stefan_Lang

Вы до сих пор не сказали нам почему для тех ограничений которые вы упомянули:

- Если это какое-то домашнее задание, было бы полезно посмотреть полный текст этого задания.

- Если это ограничение, наложенное сторонней библиотекой, которое вы не можете изменить, было бы полезно знать, какие части находятся в этой библиотеке, а какие нет (и, следовательно, могут быть изменены).

- если это заказчик программного проекта, который вы разрабатываете, и он накладывает на вас эти ограничения, было бы полезно понять мотивацию, стоящую за этим.

Stefan_Lang

О, и просто в стороне, если вы можете использовать только то, что есть на диаграмме, и код, который вы показали, содержит все это, нет никакого способа установить цену - она закрыта и инициализирована неизвестным случайным значением!