2012-03-31 15 views
0

デコレータデッサンパターンを使ってコード例を書く必要があります。これは私の例です。が欲しいです。 私はここに新たなんだ、これが私の最初の質問であるイムは、正しい方法でこれをやっている場合ので、IDKのが、ここでC++のコードがあります:デコレータと継承を使用すると、変数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); 

} 

これは

エルカフェESが エルをdescafeinado出力されますPRECIOデルカフェESデ:160 //これが正しい

エルカフェTIENEのレチェ エルカフェES descafeinado エルPRECIO・デル・カフェESデ:260 //間違った

エルカフェ電子のTIENEのアスーカル エルカフェTIENEのレチェ エルカフェのESはESデ エルPRECIO・デル・カフェをdescafeinado://間違った

答えて

1

は次のようになります。

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

あなたにデコレータを使用する必要があるためあなたのcoffe(あなたの具体的なコンポーネント)を飾り、別のデコレータを飾るのではない。

+0

しかし、私は同じコーヒーに2つのデコレータを追加する例を挙げることができません –

+0

ああ!それを固定して、気にしないでください。どうもありがとうございます! :) –

+0

私はそれが正しいかどうかわからないので、私はかなり新しいです。 –

関連する問題