こんにちは、実際の例で「Decorator」パターンを実装しようとしましたが、(Burger * b)(main関数内)にオブジェクトをデコレートできません。私はConcretteBurger(で「新しいチーズ」と入力した場合) - Visual Studioがエラーを私に示しています。私はコンセプトを理解していなかった実際の例のデコレータパターン
#include<iostream>
using namespace std;
class Burger{
public:
virtual int get_cost() = 0;
};
class ConcretteBurger: public Burger{
public:
int get_cost(){
return 3;
}
};
class BurgerDecorator:public Burger{
private:
Burger *b;
public:
BurgerDecorator(Burger* bb){
bb = b;
}
~BurgerDecorator(){
delete b;
}
int get_cost(){
return b->get_cost();
}
};
class Tomato:public BurgerDecorator{
public:
Tomato(Burger *b):BurgerDecorator(b){
}
int get_cost(){
return BurgerDecorator::get_cost() + 4;
}
};
class Cheese:public BurgerDecorator{
public:
Cheese(Burger *b):BurgerDecorator(b){}
int get_cost(){
return BurgerDecorator::get_cost()+3;
}
};
int main(){
Burger* b = new ConcretteBurger(new Cheese);
cout<<b->get_cost();
system("pause");
}
「チーズ 『を』なしdefaulsコンストラクタクラスのために存在する」第二の問題:BurgerDecorator(b)関数宣言後。例:
Tomato(Burger *b):BurgerDecorator(b){}
私はC++の本で見つけられませんでした。
Burger* b = new Cheese(new ConcretteBurger);
の代わりにこの:バーガーではなく、反対を飾る
Burger* b = new ConcretteBurger(new Cheese);
チーズ
は、あなたがこれを行う必要がありmain
機能で
「Cheese」のコンストラクタはCheese(Burger * b)のみです。したがって、あなたは 'Burger * 'で構築することしかできず、引数なしで作ることはできません。 'Burger *'を与えずに構築するには、引数を取らないコンストラクタ( 'Cheese()')を与えたり、コンストラクタに何も供給されていないときに使うデフォルトの引数を与えたりする「Cheese(Burger * b =新しいバーガー)」)。 –