2009-08-18 9 views
0

Ich versuche, eine Nachschlagetabelle der Elementfunktionen in meinem Code zu erstellen, aber es scheint zu versuchen, meinen Kopierkonstruktor aufzurufen, den ich blockiert habe, indem ich eine "nicht kopierbare" Klasse erweitert habe. Was ich habe, ist etwas wie das Folgende.Memberfunktionszeiger ruft Kopierkonstruktor auf?

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

Der Fehler ist, dass die ‚(this -> ...‘ Zeile versucht, den Copy-Konstruktor aufzurufen, die nicht sichtbar ist, warum es versucht, dies zu tun, und was habe ich so zu ändern. es wird nicht?

+0

Konnten Sie die exakte Fehlermeldung posten, die Sie sehen? –

+0

Sprechen Sie über den Foo-Kopierkonstruktor oder den Bar-Kopierkonstruktor? Wenn die Bar, dann ist dies ein wirklich grundlegendes Problem (unten von litb beantwortet). Wenn das Foo, dann poste bitte ein kompilierbares Codebeispiel, weil, als ich die ... s ausfüllte und Foo von einer nicht kopierbaren Klasse erbte, funktionierte das gut. –

Antwort

5

sie Stellen Referenzparameter.

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

In C++, sonst solche Ebene Parameter einfach nicht Objekte verweisen, aber sie sind diejenigen Objekte selbst. sie Referenzparameter machen wird lediglich verweisen, was In dieser Hinsicht hat C++ dieselbe Semantik wie C (in der Sie dies tun würden) d verwende Zeiger dafür).

+0

Danke. Ich war von der Fehlermeldung verwirrt, weil sowohl Foo als auch Bar nicht kopierbar waren, und ich dachte, dass es versuchte, Foo zu kopieren. Natürlich versuchte es Bar zu kopieren. –

Verwandte Themen