こんにちは、高木です。
今回はgeometry_managerクラスにforgetコマンドを追加していきます。その前に、前回作ったconfigureコマンドと共通の下請け関数を作れそうなので、先にそちらの整備からやっていきます。
共通の下請け関数として、引数違いのsub_commandメンバー関数を実装します。アクセス指定子はprivateでもいいんですが、念のためprotectedにしておきましょう。コードは以下のようになります。
| 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | protected:     // サブコマンド     int sub_command(tcl::obj command, std::initializer_list<window> windows, std::initializer_list<tcl::obj> options) const     {       std::vector<Tcl_Obj*> args{ this->type_.get(), command.get() };       auto interp = set_window_parameters(args, windows);       set_options(args, options);       return interp.evaluate(args);     }     // サブコマンド: オプション無し     int sub_command(tcl::obj command, std::initializer_list<window> windows) const     {       std::vector<Tcl_Obj*> args{ this->type_.get(), command.get() };       auto interp = set_window_parameters(args, windows);       return interp.evaluate(args);     }     // サブコマンド: ウィジェト1つ、オプションあり     int sub_command(tcl::obj command, const window& w, std::initializer_list<tcl::obj> options) const     {       std::vector<Tcl_Obj*> args{ this->type_.get(), command.get(), w.get().path().get() };       auto interp = w.get().interpreter();       set_options(args, options);       return interp.evaluate(args);     }     // サブコマンド: ウィジェット1つ、オプション無し     int sub_command(tcl::obj command, const window& w) const     {       return sub_command(command, w, {});     } | 
せっかくですので、このsub_commandメンバー関数を使ってconfigureメンバー関数も書き換えておきます。
| 0 1 2 3 4 5 6 7 8 9 10 11 12 |     // configureコマンド     int configure(std::initializer_list<window> windows, std::initializer_list<tcl::obj> options) const     {       return sub_command(u8"configure", windows, options);     }     // configureウィジェト1つ、オプションあり     int configure(const window& w, std::initializer_list<tcl::obj> options) const     {       return sub_command(u8"configure", w, options);     } | 
同じようにすれば、forgetメンバー関数も簡単に実装できますね。
一応、forgetコマンドについて簡単に説明しておきます。forgetコマンドというのは、いったんジオメトリーマネージャーで配置したウィジェットを取り除くために使います。取り除いたウィジェットは削除されるわけではないので、あらためてジオメトリーマネージャーで配置し直すこともできます。
それではコードを見ていきます。
| 0 1 2 3 4 5 6 7 8 9 10 |     int forget(std::initializer_list<window> windows) const     {       return sub_command(u8"forget", windows);     }     int forget(const window& w) const     {       return sub_command(u8"configure", w);     } | 
こんな感じで、sub_commandメンバー関数を呼び出すだけですね。
今回はコードばかりになってしまいましたが、これといった説明はいらないと思います。次回は全ジオメトリーマネージャーに共通のコマンドを一気に実装していきます。今回実装したsub_commandメンバー関数が役に立ってくれそうです。


![[迷信] freeでメモリを開放する](https://www.kijineko.co.jp/wp-content/uploads/2021/06/3649452_s.jpg)



