【问题标题】:Member function pointer calls copy constructor?成员函数指针调用复制构造函数?
【发布时间】:2009-08-18 14:22:58
【问题描述】:

我正在尝试在我的代码中创建成员函数的查找表,但它似乎正在尝试调用我的复制构造函数,我已通过扩展“不可复制”类来阻止它。我所拥有的类似于以下内容。

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->...' 行尝试调用不可见的复制构造函数。为什么要尝试这样做,我必须更改什么才能使其不会?

【问题讨论】:

  • 您能发布您看到的确切错误消息吗?
  • 你说的是Foo拷贝构造函数还是Bar拷贝构造函数?如果是吧,那么这是一个非常基本的问题(下面由 litb 回答)。如果是 Foo,那么请发布一个可编译的代码示例,因为当我填写 ...s 并使 Foo 从一个不可复制的类继承时,这工作得很好。

标签: c++ function-pointers lookup-tables


【解决方案1】:

使它们成为参考参数。

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 相同的语义(在其中你可以使用指针)。

【讨论】:

  • 谢谢。我对错误消息感到困惑,因为 Foo 和 Bar 都是不可复制的,我认为它试图复制 Foo。它当然是在尝试复制 Bar。
猜你喜欢
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
相关资源
最近更新 更多