2009-08-18 7 views
0

J'essaie de créer une table de recherche de fonctions membres dans mon code, mais il semble essayer d'appeler mon constructeur de copie, que j'ai bloqué en étendant une classe "uncopyable". Ce que j'ai est quelque chose comme ce qui suit.Un pointeur de fonction membre appelle un constructeur de copie?

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); 
    } 
}; 

L'erreur est que le « (ce -> ... » ligne essaie d'appeler le constructeur de copie, non visible Pourquoi est-il tente de le faire, et qu'est-ce que je dois changer ainsi. il ne sera pas?

+0

Pourriez-vous poster le message d'erreur exact que vous voyez? –

+0

Parlez-vous du constructeur de copie Foo ou du constructeur de copie de barre? Si la barre, alors c'est un problème vraiment fondamental (répondu ci-dessous par litb). Si le Foo, alors s'il vous plaît poster un échantillon de code compilable, parce que quand j'ai rempli le ... s et fait Foo hériter d'une classe uncopyable, cela a très bien fonctionné. –

Répondre

5

Faites-les paramètres de référence.

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); 
    } 
}; 

En C++, sinon ces paramètres simples ne référencent pas seulement des objets, mais ils sont eux-mêmes ces objets. les rendre les paramètres de référence référencera simplement ce que Dans ce cas, C++ a la même sémantique que C (dans laquelle vous d utiliser des pointeurs pour cela).

+0

Merci. J'ai été troublé par le message d'erreur parce que Foo et Bar étaient introuvables, et j'ai pensé qu'il essayait de copier Foo. Bien sûr, il essayait de copier Bar. –

Questions connexes