3

C++ でのデコレータ パターンの動作について質問があります。次のシナリオを考えてみましょう(ネットから入手しました。申し訳ありませんが、すべての詳細を提供する必要があったため、質問を小さくすることはできませんでした。)

class print{
  public:
   virtual ~print(){};
   virtual void print_name() = 0;
};

//Actual base class which is to be used for printing. Has only name
class name:public print{
   public:
  //Destructor
  ~name() { cout << "destructing name" << endl; } 
  void print_name(){ 
    cout << "Ajay " << endl;
  }
 };

class decorator:public print{
   print *print_content;
       public:

   //constructor
   decorator(print* print_arg){
    print_content = print_arg;
   }

   //Destructor
   ~decorator() {
       if(print_content){
        delete print_content;
        print_content = NULL;
       }
    }

   void print_name(){
       print_content->print_name();
   }
   };

class surname:public decorator{
    public:

//Constructor
surname( print * print_arg ):decorator(print_arg) {}

//Destructor
   ~surname(){ 
    cout << "Destructing surname" << endl;
   }

   void print_name(){
    cout << " Bidari" << endl;
    decorator::print_name();
   }
    };

 class address:public decorator{
   public:
   address( print * print_arg):decorator(print_arg) {}
   ~address(){
       cout <<"Destructing address" << endl;
   }
   void print_name(){
    cout << "Bijapur" << endl;
    decorator::print_name();
   }
   }; 

すべてのクラスには、装飾的なデザイン パターンで必要なセマンティクスが必要です。主機能は以下の通りです。

int main(){

    print * name_surname_address = new address(new surname(new name));
   name_surname_address->print_name();
}

プログラムは期待どおりに結果を出力します。

出力

 Bidari
Ajay

Bijapur
 Bidari
Ajay

呼び出しが surname::print_name() に到達する方法がわかりません。つまり、関数呼び出し

print * name_surname_address = new address(new surname(new name));

address の print_name を呼び出し、decorator::print_name() を呼び出し、次に print::print_name() を呼び出します。

4

1 に答える 1