2009-08-18 122 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