为什么我需要一个对象数组的双指针? C++ 中的 HashMap 示例
Why do I need double pointers for an array of objects? HashMap Example in C++
我正在练习一些 C++,我对为什么我需要对象数组(例如节点结构)的双指针感到困惑。这是一个简单的代码片段来解释我的情况:
struct HashNode{
HashNode* next;
int data;
int key;
int hashCode;
HashNode::HashNode(
HashNode* next,
const int& data,
const int& key,
const int& hashCode
) : next(next), data(data), key(key), hashCode(hashCode)
{}
};
class HashMap{
public:
HashMap();
HashMap(int tableSize);
~HashMap();
private:
//Here is the double pointer
HashNode** table;
};
HashMap::HashMap(){
//Here is the array initialization
table = new HashNode*[100];
}
我已经删除了该问题不需要的代码。
如果我这样删除双指针:
HashNode* table;
和
table = new HashNode[100];
我收到以下错误。
hashmap.cpp: In method `HashMap::HashMap()':
hashmap.cpp:87: no matching function for call to `HashNode::HashNode ()'
hashmap.cpp:61: candidates are: HashNode::HashNode(const HashNode &)
hashmap.cpp:58: HashNode::HashNode(HashNode *, const int &, cons
t int &, const int &)
这表明 HashNode 试图 运行 一个构造函数。
如果我仅将数组的初始化更改为 table = new HashNode*[100];
,同时保持 HashNode* table;
,则会出现以下错误。
hashmap.cpp: In method `HashMap::HashMap()':
hashmap.cpp:87: assignment to `HashNode *' from `HashNode **'
我的假设是,当我制作一个对象数组时,我需要对象的生命周期也与程序的持续时间相同。这要求我对对象和数组使用指针。因此,我需要数组的双指针,因为它指向指针,我需要对象的指针。
但是,我仍然不确定,我在网上找不到任何好的解释。有人可以解释一下这种情况吗?
此实现使用 separate chaining with linked lists 来管理哈希冲突。因此,table
是一个指向HashNode
的指针数组,意思是它需要两个星号:
- 一个星号来自数组元素的类型,即
HashNode*
- 另一个星号来自
HashNode*
的数组
这也是为什么你在 new
表达式中有一个星号:
table = new HashNode*[100];
// ^
看来你对c++指针很陌生。
你目前正在做的是制作 100 个指针的数组。所以编译器不会给你任何错误,因为实际对象不是用这一行创建的。
哈希节点**table = 新哈希节点*[100];
但是当你使用
HashNode *table = new HashNode[100];
然后你试图为 HashNode 创建 100 个对象;
但是你没有默认构造函数所以编译器给你上面的错误。
我附上了以下工作代码。检查一下。
#include <iostream>
using namespace std;
struct HashNode{
HashNode* next;
int data;
int key;
int hashCode;
HashNode(){}
HashNode(
HashNode* next,
const int& data,
const int& key,
const int& hashCode
) : next(next), data(data), key(key), hashCode(hashCode)
{}
};
class HashMap{
public:
HashMap();
private:
//Here is the double pointer
HashNode* table;
};
HashMap::HashMap(){
//Here is the array initialization
table = new HashNode[100];
}
int main() {
// your code goes here
HashMap ob;
std::cout << "him" << std::endl;
return 0;
}
在这里声明指针数组
HashNode** table;
这是一个名为 table 的数组,其指针类型为 hashNode。
我正在练习一些 C++,我对为什么我需要对象数组(例如节点结构)的双指针感到困惑。这是一个简单的代码片段来解释我的情况:
struct HashNode{
HashNode* next;
int data;
int key;
int hashCode;
HashNode::HashNode(
HashNode* next,
const int& data,
const int& key,
const int& hashCode
) : next(next), data(data), key(key), hashCode(hashCode)
{}
};
class HashMap{
public:
HashMap();
HashMap(int tableSize);
~HashMap();
private:
//Here is the double pointer
HashNode** table;
};
HashMap::HashMap(){
//Here is the array initialization
table = new HashNode*[100];
}
我已经删除了该问题不需要的代码。
如果我这样删除双指针:
HashNode* table;
和
table = new HashNode[100];
我收到以下错误。
hashmap.cpp: In method `HashMap::HashMap()':
hashmap.cpp:87: no matching function for call to `HashNode::HashNode ()'
hashmap.cpp:61: candidates are: HashNode::HashNode(const HashNode &)
hashmap.cpp:58: HashNode::HashNode(HashNode *, const int &, cons
t int &, const int &)
这表明 HashNode 试图 运行 一个构造函数。
如果我仅将数组的初始化更改为 table = new HashNode*[100];
,同时保持 HashNode* table;
,则会出现以下错误。
hashmap.cpp: In method `HashMap::HashMap()':
hashmap.cpp:87: assignment to `HashNode *' from `HashNode **'
我的假设是,当我制作一个对象数组时,我需要对象的生命周期也与程序的持续时间相同。这要求我对对象和数组使用指针。因此,我需要数组的双指针,因为它指向指针,我需要对象的指针。
但是,我仍然不确定,我在网上找不到任何好的解释。有人可以解释一下这种情况吗?
此实现使用 separate chaining with linked lists 来管理哈希冲突。因此,table
是一个指向HashNode
的指针数组,意思是它需要两个星号:
- 一个星号来自数组元素的类型,即
HashNode*
- 另一个星号来自
HashNode*
的数组
这也是为什么你在 new
表达式中有一个星号:
table = new HashNode*[100];
// ^
看来你对c++指针很陌生。 你目前正在做的是制作 100 个指针的数组。所以编译器不会给你任何错误,因为实际对象不是用这一行创建的。 哈希节点**table = 新哈希节点*[100];
但是当你使用 HashNode *table = new HashNode[100]; 然后你试图为 HashNode 创建 100 个对象; 但是你没有默认构造函数所以编译器给你上面的错误。
我附上了以下工作代码。检查一下。
#include <iostream>
using namespace std;
struct HashNode{
HashNode* next;
int data;
int key;
int hashCode;
HashNode(){}
HashNode(
HashNode* next,
const int& data,
const int& key,
const int& hashCode
) : next(next), data(data), key(key), hashCode(hashCode)
{}
};
class HashMap{
public:
HashMap();
private:
//Here is the double pointer
HashNode* table;
};
HashMap::HashMap(){
//Here is the array initialization
table = new HashNode[100];
}
int main() {
// your code goes here
HashMap ob;
std::cout << "him" << std::endl;
return 0;
}
在这里声明指针数组
HashNode** table;
这是一个名为 table 的数组,其指针类型为 hashNode。