C++のメンバ関数のアドレス

解決


加藤  2007-08-06 12:38:07  No: 65972

VC++ではなくC++の質問です。(すみません。。)

サービス管理用のクラスを作成しています。そのクラスで以下のような処理を行っているのですが、関数アドレスを指定する箇所でコンパイルエラーが出てしまいます。

void CWinService::StartMyServiceCtrlDispatcher(LPCTSTR lpServiceName)
{
  SERVICE_TABLE_ENTRY ent;
  ent.lpServiceName=(LPSTR)lpServiceName;
         /* ↓ここの指定で staticのメンバ関数にしないとコンパイルエラーになる */
  ent.lpServiceProc=CWinService::ServiceMain;
  StartServiceCtrlDispatcher (&ent);
}

void WINAPI CWinService::ServiceMain(DWORD ac, char **av){/* 割愛 */}

できれば、コンパイルエラーが出ているメンバは、virtualで指定したいのですが、static 指定じゃなければメンバ関数アドレスの取得はできないのでしょうか。

基礎的なところで申し訳ないのですが、よろしくお願いします。


επιστημη  2007-08-06 15:39:11  No: 65973

// ヒント: static関数からメンバ関数を呼べばいい。

#include <iostream>  // cout, endl

class foo {
  int value;
  void f(int arg) { std::cout << "foo(" << value << ")::f(" << arg << ")\n"; }
  static void g(foo* self, int arg) { self->f(arg); }
public:
  foo(int v) : value(v) {}
  void run(int arg) { g(this,arg); }
};

int main() {
  foo f(123);
  f.run(456);
}


加藤  2007-08-07 09:20:41  No: 65974

解決しました。
わかりにくい文章に回答いただき、大変感謝です。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加