使用装饰器和继承,不会改变我的变量C ++的值

时间:2012-03-31 02:19:29

标签: c++ inheritance decorator

所以,我需要使用装饰器dessign模式编写一个示例代码,这是我的例子,它非常简单但是idk为什么它不打印我想要的东西。 我是新来的,这是我的第一个问题,如果我以正确的方式做到这一点,但这里是C ++中的代码:

include < iostream >

using namespace std;

class CafeAbstracto {
protected:
    int size;
    int precio;
public:

    void setsize(int n) {
        this->size = n;
        this->precio = n*10;
    }

    void setprecio(int p) {
        this->precio += p;
    }
    int getprecio(){
        return this->precio;
    }
    virtual void imprimirprecio(void) = 0;
};

class Cafe : public CafeAbstracto {
public:  

    void imprimirprecio() {
       int prec=getprecio();
        cout << "El precio del cafe es de: " << prec << endl;
    }
};

class CafeDecorator : public CafeAbstracto {
protected:

    CafeAbstracto *Cafe_con_extras;
public:

    CafeDecorator(CafeAbstracto *nuevo_cafe) {
        Cafe_con_extras = nuevo_cafe;
    }
    virtual void imprimirprecio()=0;
};

class Leche : public CafeDecorator {
public:

    Leche(CafeAbstracto* nuevo_cafe, bool tiene) : CafeDecorator(nuevo_cafe) {
    }

     void imprimirprecio() {        
        cout << "El cafe tiene leche" << endl;
        Cafe_con_extras->setprecio(5240);
        Cafe_con_extras->imprimirprecio();
    }
};

class Azucar : public CafeDecorator {
public:

    Azucar(CafeAbstracto* nuevo_cafe, bool tiene) : CafeDecorator(nuevo_cafe) {
    }

    virtual void imprimirprecio() {
        Cafe_con_extras->setprecio(50);
        cout << "El cafe tiene azucar" << endl;
        Cafe_con_extras->imprimirprecio();
    }
};

class Descafeinado : public CafeDecorator {
public:

    Descafeinado(CafeAbstracto* nuevo_cafe, bool es) : CafeDecorator(nuevo_cafe) {
    }
    void imprimirprecio() { 
        Cafe_con_extras->setprecio(100);
        cout << "El cafe es descafeinado" << endl;
        Cafe_con_extras->imprimirprecio();
    }
};

int main(int argc, char *argv[]) {

    Cafe *coffee = new Cafe();
    coffee->setsize(6);
    Descafeinado *cafedescaf = new Descafeinado(coffee, true);
    cafedescaf->imprimirprecio();

    Leche *descafyconleche = new Leche(cafedescaf, true);
    descafyconleche->imprimirprecio();
    Azucar *cafe_des_leche= new Azucar(descafyconleche, true);
    cafe_des_leche->imprimirprecio();

    delete coffee;
    delete cafedescaf;
    delete descafyconleche;
    delete cafe_des_leche;

    return (0);

}

这是输出

El cafe es descafeinado El precio del cafe es de:160 //这个是正确的

El cafe tiene leche El cafe es descafeinado El precio del cafe es de:260 //不正确

El cafe tiene azucar El cafe tiene leche El cafe es descafeinado El precio del cafe es de:360 //不正确

1 个答案:

答案 0 :(得分:1)

Leche *descafyconleche = new Leche(cafedescaf, true);
descafyconleche->imprimirprecio();
Azucar *cafe_des_leche= new Azucar(descafyconleche, true);
cafe_des_leche->imprimirprecio();

应该是:

Leche *descafyconleche = new Leche(coffee, true);
descafyconleche->imprimirprecio();
Azucar *cafe_des_leche= new Azucar(coffee, true);
cafe_des_leche->imprimirprecio();

因为您需要使用装饰器来装饰你的咖啡(你的具体组件),而不是装饰另一个装饰器。