gpt4 book ai didi

c++ - 函数指针的HashMap(类成员函数)

转载 作者:行者123 更新时间:2023-11-28 07:56:19 25 4
gpt4 key购买 nike

我必须创建一个非常基本的函数指针 HashMap 。我的要求只是在其中添加值,然后根据键获取它。由于某些政治原因,我不能使用任何标准库。我有一个工作正常的代码。但是,如果我想要一个指向我的类成员函数的函数指针,那么这是行不通的。任何建议应该在下面的代码中进行修改。

在此 PING 和 REFRESH 是独立的功能。所以这段代码有效。但是,如果我将这些函数移至 HashMap 类,则它会失败。

代码:--

#include <iostream> 
#include <cstdlib>
#include <cstring>
#include <iomanip>
using namespace std;
typedef void (*FunctionPtr)();

void ping(){
cout<<"ping";
}
void refresh(){
cout<<"refresh";
}

class HashEntry {
private:
int key;
FunctionPtr func_ptr1;;
public:
HashEntry(int key, FunctionPtr fptr) {
this->key = key;
this->func_ptr1 = fptr;
}
int getKey() {
return key;
}
FunctionPtr getValue() {
return this->func_ptr1;
}
};

const int TABLE_SIZE = 128;
class HashMap {
private:
HashEntry **table;
public:
HashMap() {
table = new HashEntry*[TABLE_SIZE];
for (int i = 0; i < TABLE_SIZE; i++)
table[i] = NULL;
}

FunctionPtr get(int key) {
int hash = (key % TABLE_SIZE);
while (table[hash] != NULL && table[hash]->getKey() != key)
hash = (hash + 1) % TABLE_SIZE;
if (table[hash] == NULL)
return NULL;
else
return table[hash]->getValue();
}

void put(int key, FunctionPtr fptr) {
int hash = (key % TABLE_SIZE);
while (table[hash] != NULL && table[hash]->getKey() != key)
hash = (hash + 1) % TABLE_SIZE;
if (table[hash] != NULL)
delete table[hash];
table[hash] = new HashEntry(key, fptr);
}

~HashMap() {
for (int i = 0; i < TABLE_SIZE; i++)
if (table[i] != NULL)
delete table[i];
delete[] table;
}
};


void main(){
HashMap* pHashsMap = new HashMap();
pHashsMap->put(1,ping);
pHashsMap->put(2,refresh);
pHashsMap->put(3,ping);
pHashsMap->put(4,refresh);
pHashsMap->put(5,ping);
pHashsMap->put(6,refresh);

cout<<" Key 1---"<<pHashsMap->get(1)<<endl;
pHashsMap->get(1)();
cout<<" Key 5---"<<pHashsMap->get(5)<<endl;
pHashsMap->get(5)();
cout<<" Key 3---"<<pHashsMap->get(3)<<endl;
pHashsMap->get(3)();
cout<<" Key 6---"<<pHashsMap->get(6)<<endl;
pHashsMap->get(6)();

delete pHashsMap;
}

最佳答案

聪明的 alec 答案:检查 std::bind 的代码,从中学习,然后创建您自己的代码(尽管说实话,不使用 STL/boost 并不明智...) .

更简单的答案:你需要创建一个 union 类型来保存你的普通函数指针和一个类成员函数指针,然后存储一个 bool 值来指示它是否是一个类指针:

class funcbind_t
{
union
{
void (*pf)();
void (SomeClass::*mfp)();
};

bool member;

funcbind_t(void (*_pf)()) : pf(_pf), member(false)
{
}

funcbind_t(void (SomeClass::*_mpf)()) : mpf(_mpf), member(true)
{
}

void operator ()()
{
if(member)
mfp();
else
fp();
}
};

如您所见,当您开始需要函数的不同参数时,这会变得困惑。

关于c++ - 函数指针的HashMap(类成员函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12643055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com