関数引数で初期化される変数と戻り値をともにクラスの const メンバーにしたい
C/C++ の関数は複数の値を戻すのが苦手なので、たいていのプログラマーは関数の引数を戻り値を格納する場所として使う方法に染められていく。
/* create new Object and returns its id */ Id object_initialize(/*[out]*/ Object** object);
さて、この Id と Object とを、ともにテストフィクスチャーの const オブジェクトとして覚えさせたくなることがある。
class TestFixture : public testing::Test { protected: const Id id_; const Object *const object_; public: ... };
さて、しかし、だ。
const オブジェクトは初期化リストで明示的に初期化しなければならないのに object_initialize は戻り値をひとつしか返さず、悪いことにその引数をもうひとつの const オブジェクトの値に利用したいのだ。
とりあえずわたしがおもいついた方法は、隠し変数をひとつ追加し、値の受け渡しに使うというものだ。:
class TestFixture : public testing::Test { protected: const Id id_; const Object *const object_; public: TestFixture() : id_(object_initialize(&tmp_var_)), object_(tmp_var_) {} private: Object *tmp_var_; };
もとの関数がもとからペアを戻すように設計/実装されていたらねえ…。