2009-08-18 127 views
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); 
    } 
}; 

的错误是“(这一点 - > ...”行试图调用拷贝构造函数,它是不可见的为什么试图做到这一点,和我有什么改变如此。它会不会?

+0

你能发布你看到的确切的错误消息吗? – 2009-08-18 14:27:58

+0

你是在谈论Foo拷贝构造函数还是Bar拷贝构造函数?如果酒吧,那么这是一个非常基本的问题(以下用litb回答)。如果Foo,请发布一个可编译的代码示例,因为当我填充... s并使Foo从一个不可复制的类继承时,这工作得很好。 – 2009-08-18 14:33:24

回答

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

+0

谢谢。我对错误信息感到困惑,因为Foo和Bar都是不可复制的,我以为它试图复制Foo。当然,它试图复制酒吧。 – 2009-08-18 14:33:26