0

コードでメンバー関数のルックアップ テーブルを作成しようとしていますが、「コピーできない」クラスを拡張してブロックしたコピー コンストラクターを呼び出そうとしているようです。私が持っているのは次のようなものです。

enum {FUN1_IDX, FUN2_IDX, ..., NUM_FUNS };

class Foo {
  fun1(Bar b){ ... }
  fun2(Bar b){ ... }
  ...
  void (Foo::*lookup_table[NUM_FUNS])(Bar b);
  Foo(){ 
    lookup_table[FUN1_IDX] = &Foo::fun1;
    lookup_table[FUN2_IDX] = &Foo::fun2;
  }

  void doLookup(int fun_num, Bar b) {
    (this->*lookup_table[fun_num])(b);
  }
};

エラーは、'(this->...' 行がコピー コンストラクターを呼び出そうとすることですが、これは表示されません。

4

1 に答える 1

5

それらを参照パラメーターにします。

enum {FUN1_IDX, FUN2_IDX, ..., NUM_FUNS };

class Foo {
  fun1(Bar &b){ ... }
  fun2(Bar &b){ ... }
  ...
  void (Foo::*lookup_table[NUM_FUNS])(Bar &b);
  Foo(){ 
    lookup_table[FUN1_IDX] = &Foo::fun1;
    lookup_table[FUN2_IDX] = &Foo::fun2;
  }

  void doLookup(int fun_num, Bar &b) {
    (this->*lookup_table[fun_num])(b);
  }
};

C++ では、それ以外の場合、そのような単純なパラメーターはオブジェクトを参照するだけでなく、それらのオブジェクトそのものです。それらを参照パラメーターにすることは、渡されたものを参照するだけです。この点で、C++ は C と同じセマンティクスを持っています (そのためにポインターを使用します)。

于 2009-08-18T14:29:42.793 に答える