読者です 読者をやめる 読者になる 読者になる

C++のクラスをconfig構造体の代わりに利用する

C++プログラマたるもの、とりあえず、config構造体をclassにしたい。しかしながら、create関数でコンストラクタを呼ぶのは良いものの、デストラクタはどうやって呼ぶのか。どうやら、apr_pool_userdata_setを使うのがミソのようです(未テスト)。

class helloworld_per_dir_config
{
public:
  static void* create(apr_pool_t* p, char* arg)
  {
    helloworld_per_dir_config* conf = new helloworld_per_dir_config();

    // pool解放時にデストラクタを呼んでもらいます
    apr_pool_userdata_set(conf, "helloworld_per_dir_config::create", cleanup, p);
    return conf;
  }

  ...

private:
  const char* message; // 表示するメッセージ
  
  // 初期化
  helloworld_per_dir_config() : message("")
  {
  }

  // 後片付け関数
  static apr_status_t cleanup(void* pthis)
  {
    helloworld_per_dir_config* conf = (helloworld_per_dir_config*)pthis;
    delete conf;
  }
  
  // 呼んではだめです
  helloworld_per_dir_config(const helloworld_per_dir_config&);
  helloworld_per_dir_config& operator=(const helloworld_per_dir_config&);
};

module AP_MODULE_DECLARE_DATA helloworld = {
  STANDARD20_MODULE_STUFF, 
  helloworld_per_dir_config::create,
  ....