閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

押したボタンによって生成するオブジェクトを変更したい場合などに、どういうコードを書くのが一番短く書けるだろうか

ボタンと言うかまぁなんでもいいのですけど、引数に応じて生成されるオブジェクトを変更したい場合。

それぞれのオブジェクトを生成する(newする)関数を作成し、それを配列に入れておいて、ボタンのインデックスに応じて呼ぶ関数を切り替えるのはどうか。最初、関数をクラスの数分作ろうとしてしまいましたが、テンプレートを使えば数行で済みますね。

template<class T>
T* make_new() { return new T(); }

関数ポインタの配列を作るために戻り値は固定しておきたいので、例えばBaseクラスを返すようにし、実際に生成されるのはそのクラスから派生されたクラスであるとします。

class Base {};
class A : public Base {};
class B : public Base {};

template<class T>
Base* make_new() { return new T(); }

typedef Base* (* Create)();

...

std::vector<Create> creator;
creator.push_back(make_new<A>);
creator.push_back(make_new<B>);

...

// ボタンを押す
Base* p = creator[buttonIndex]();

ボタン自体をcreator変数を使用して作るようにすると、クラスが増えた時にこの配列に要素を追加するコードを一行追加するだけで勝手にボタンが増えたりして、他の部分の変更が不要になるかな。