2 Stimmen

Initialisierungsliste mit Funktionszeiger - gibt es hier einen Trick?

Ich habe ein Lehrbuch über elementare Datenstrukturen gelesen, nur um einen Überblick zu bekommen - es ist schon eine Weile her, dass ich meine eigene Hashtabelle oder einen roten/schwarzen Baum geschrieben habe :)

Jedenfalls bin ich auf etwas gestoßen, das mich ein wenig verwirrt hat. Der Autor ist ziemlich darauf bedacht, die Initialisierungsliste für jedes Mitglied zu verwenden (wie man hoffen würde), aber in diesem einen Fall, in dem er einen Funktionszeiger an eine Hashing-Funktion übergibt, entscheidet er sich dafür, den Zuweisungsoperator im Konstruktor zu verwenden, anstatt den Zeiger in der Initialisierungsliste einzurichten (und er verwendet die Initialisierungsliste auch in diesem Code):

template<class DataType>
HashTable<DataType>::HashTable(int (*hf)(const DataType&), int s)
    : table(s)
{
    hashfunc = hf;
}

wo:

int (*hashfunc)(const DataType&);

ist ein privates Mitglied.

Ich habe mich gefragt, ob es einen ausdrücklichen Grund für diese Entscheidung gibt und ob er hier eine Falle übersehen hat - oder ob es nur ein zufälliges Versehen war. Funktionszeiger können eine interessante Syntax haben, und ich habe mich grundsätzlich gefragt, ob das in diesem Bereich ein Problem darstellt.

6voto

Mike Seymour Punkte 242473

Nein, es gibt keinen Grund, warum er nicht in der Initialisierungsliste initialisiert werden kann.

Es ist vielleicht möglich, dass ein fehlerhafter Compiler durcheinander kommt und die Initialisierung in der Liste als Funktionsaufruf interpretiert (da die Syntax ähnlich ist); vielleicht ist das die Erklärung.

2voto

mark Punkte 7279

Haben Sie versucht, einen Typedef für Ihren Funktionszeigertyp zu erstellen:

template<class DataType>
struct HashTableTraits
{
    typedef int (*func_type)(const DataType&);
};

template<class DataType>
struct HashTable
{
    HashTable( 
        typename HashTableTraits<DataType>::func_type hf, int s )
    : table( s )
    , hashfunc( hf )
    {
    }

    int table;
    typename HashTableTraits<DataType>::func_type hashfunc;
};

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X