0

クラス用に作成したハッシュ テーブル テンプレートがあります。このハッシュ テーブルの利用に依存する予定のプロジェクトがあります。バケットの数を初期化するための符号なし整数値と、ポイントするハッシュ関数を受け入れます。そのハッシュ関数はまだ書いていませんが、宣言はしています。ハッシュ テーブル データ メンバーの Game クラスでメンバー初期化子を使用しようとすると、理解できないエラーが発生します。

Error 1 error C3867: 'Game::xorHash': function call missing argument list; use '&Game::xorHash' to create a pointer to member

2 IntelliSense: no instance of constructor "HTable<Type>::HTable [with Type=std::string]" matches the argument list
        argument types are: (int, unsigned int (const std::string &s))

私のハッシュテーブルクラスは次のとおりです。

#pragma once
#include "SLList.h"

template<typename Type> class HTable
{
public:
    HTable(unsigned int numOfBuckets, unsigned int (*hFunction) (const Type &v));
    ~HTable();
    HTable<Type>& operator=(const HTable<Type>& that);
    HTable(const HTable<Type>& that);
    void insert(const Type& v);
    bool findAndRemove(const Type& v);
    void clear();
    int find(const Type& v) const;

private:
    SLList<Type>* ht;
    unsigned int (*hFunct) (const Type &v);
    unsigned int numOfBuck;
};

template<typename Type>
HTable<Type>::HTable(unsigned int numOfBuckets, unsigned int (*hFunction) (const Type     &v))
{
    ht = new SLList<Type>[numOfBuckets];
    this->numOfBuck = numOfBuckets;
    this->hFunct = hFunction;
}

template<typename Type>
HTable<Type>::~HTable()
{
    delete [] ht;
    ht = nullptr;
}  

template<typename Type>
HTable<Type>& HTable<Type>::operator=(const HTable<Type>& that)
{
    if(this != &that)
    {
        delete [] this->ht;
        this->hFunct = that.hFunct;
        this->numOfBuck = that.numOfBuck;
        this->ht = new SLList<Type>[numOfBuck];
        for(unsigned int i = 0; i < this->numOfBuck; i++)
            this->ht[i] = that.ht[i];
    }
    return *this;
}  

template<typename Type>
HTable<Type>::HTable(const HTable<Type>& that)
{
    this = *that;
}

template<typename Type>
void HTable<Type>::insert(const Type& v)
{
    ht[hFunct(v)].addHead(v);
}

template<typename Type>
bool HTable<Type>::findAndRemove(const Type& v)
{
    SLLIter<Type> iter(ht[hFunct(v)]);
    for(iter.begin(); !iter.end(); ++iter)
    {
        if(v == iter.current())
        {
            ht[hFunct(v)].remove(iter);
            return true;
        }
    }
    return false;
} 

template<typename Type>
void HTable<Type>::clear()
{
    for(unsigned int i = 0; i < this->numOfBuck; ++i)
        ht[i].clear();
}

template<typename Type>
int HTable<Type>::find(const Type& v) const
{
    SLLIter<Type> iter(ht[hFunct(v)]);
    for(iter.begin(); !iter.end(); ++iter)
    {
        if(v == iter.current())
            return hFunct(v);
    }

    return -1;
}

マイ ゲーム.h:

#pragma once

#include "stdafx.h"
#include "HTable.h"
#include "BST.h"
#include "DTSTimer.h"

using namespace std;

class Game
{
public:
    Game(void);
    virtual ~Game(void);
    void refresh();
    void input();
    unsigned int xorHash(const string &s);

private:
    string userInput;
    DTSTimer timer;
    BST<string> answers;
    HTable<string> dictionary;
};

My Game.cpp (メンバーの初期化を機能させることができないため、これは明らかに単なるスケルトンです)

 #include "Game.h"


Game::Game(void) : dictionary(2048, xorHash)
{

}


Game::~Game(void)
{

}

void Game::refresh()
{

}

void Game::input()
{

}

unsigned int Game::xorHash(const string &s)
{
    return 0;
}

私はかなり長い間これに取り組んできましたが、壁にぶつかっています。これを起動して実行する方法について、いくつかの助けをいただければ幸いです。見る必要がある別のスニペットがあるかどうか教えてください (私はその点で徹底しようとしました)。

4

1 に答える 1

1

2 つの問題があります。1 つ目は、メンバー関数ポインターを適切に渡していないことです (エラー メッセージには、何を行うかが正確に示されています)。もう 1 つの問題は、関数ポインターがメンバー関数ポインターと同じではないことです。

メンバー関数ポインターには、メンバー関数を呼び出すためのインスタンス オブジェクト オブジェクトが必要です。そして、このインスタンスは、通常の関数にはない隠し第一引数として渡されます。

このために、代わりにstd::functionandに目を向けることができますstd::bind:

class HTable
{
public:
    HTable(unsigned int numOfBuckets, std::function<unsigned int(const Type&)> hFunction);
    ...

private:
    std::function<unsigned int(const Type&)> hFunct;
    ...
};

それで

Game::Game(void) : dictionary(2048, std::bind(&Game::xorHash, this))
{
}
于 2013-11-09T18:54:19.917 に答える