如何在 C++ 中存储泛型元素数组?
How to store an array of generic elements in C++?
我正在尝试用 C++ 构建一个固定大小的哈希table; table 应该能够获取任何类型的数据,因此我使用模板来完成此操作。我正在尝试使用 void 指针数组来保存我的链接列表,但我很难让它工作。
节点结构:
template <typename T>
struct Node {
std::string key;
T val;
Node<T> next;
}
Class:
class HashTable {
private:
int size;
int elements;
void **table;
public:
HashTable(int size) {
this->size = size;
elements = 0;
table = new void*[size];
//initialize table
for(int i = 0; i < size; i++) {
table[i] = NULL;
}
}
~HashTable() {
delete [] table;
}
template <typename T>
bool set(string key, T val) {
std::tr1::hash<std::string> hash_function;
std::size_t hash_value = hash_function(key);
int idx = hash_value % size;
if(table[idx] == NULL) {
//newly created bucket, increment elements variable to signify bucket use
elements++;
Node<T> node;
node.key = key;
node.val = val;
node.next = NULL;
table[idx] = &node;
cout << "Node: " << node.key << ", " << *node.val << endl;
//first error
cout << "Table: " << table[idx].key << endl;
//second error
cout << "Table: " << (Node<T>)table[idx].key << endl;
//third error
cout << "Table: " << static_cast<Node<T>>(table[idx]).key << endl;
} else {
}
}
//other methods
根据我的尝试,我会遇到很多不同的错误...
error: request for member 'key' in '((HashTable*)this)->HashTable::table[idx]', which is of non-class type 'void*'
与第一个错误相同。
这一行给我一大堆可怕的错误信息。
我现在不知道如何让我想要的东西发挥作用。我应该制作什么类型的指针而不是 void?
table
是一个 void**
,所以 table[idx]
是一个 void*
。你的解决方案应该是这样的:
((Node<T>*)table[idx])->key
我正在尝试用 C++ 构建一个固定大小的哈希table; table 应该能够获取任何类型的数据,因此我使用模板来完成此操作。我正在尝试使用 void 指针数组来保存我的链接列表,但我很难让它工作。
节点结构:
template <typename T>
struct Node {
std::string key;
T val;
Node<T> next;
}
Class:
class HashTable {
private:
int size;
int elements;
void **table;
public:
HashTable(int size) {
this->size = size;
elements = 0;
table = new void*[size];
//initialize table
for(int i = 0; i < size; i++) {
table[i] = NULL;
}
}
~HashTable() {
delete [] table;
}
template <typename T>
bool set(string key, T val) {
std::tr1::hash<std::string> hash_function;
std::size_t hash_value = hash_function(key);
int idx = hash_value % size;
if(table[idx] == NULL) {
//newly created bucket, increment elements variable to signify bucket use
elements++;
Node<T> node;
node.key = key;
node.val = val;
node.next = NULL;
table[idx] = &node;
cout << "Node: " << node.key << ", " << *node.val << endl;
//first error
cout << "Table: " << table[idx].key << endl;
//second error
cout << "Table: " << (Node<T>)table[idx].key << endl;
//third error
cout << "Table: " << static_cast<Node<T>>(table[idx]).key << endl;
} else {
}
}
//other methods
根据我的尝试,我会遇到很多不同的错误...
error: request for member 'key' in '((HashTable*)this)->HashTable::table[idx]', which is of non-class type 'void*'
与第一个错误相同。
这一行给我一大堆可怕的错误信息。
我现在不知道如何让我想要的东西发挥作用。我应该制作什么类型的指针而不是 void?
table
是一个 void**
,所以 table[idx]
是一个 void*
。你的解决方案应该是这样的:
((Node<T>*)table[idx])->key