我有一个指向名为“table”的结构的指针数组(该结构称为Node)。
我在类中声明了数组:
Node * table;
然后,在另一种方法中,我将表格初始化:
this->table = new Node [this->length];
一切正常。 this-> length是一个有效的条目,this-> table指向正确的数组,等等。但是,我尝试更改元素的值:
for(int i = 0; i < this->length; i++) {
this->table[i] = new Node;
}
甚至
for(int i = 0; i < this->length; i++) {
this->table[i] = 0;
}
一切都开始了。为什么我不能将这些指针设置为任何东西?
这是我得到的错误:
(其中第15行是“this-&gt; table [i] = new Node;”的行。)
我讨厌发布长段代码,所以这里是代码本身的缩短版本:
template <class T, class S>
class HashMap {
public:
HashMap();
private:
struct Node;
Node * table;
static const unsigned length = 100;
};
template <class T, class S>
HashMap<T, S>::HashMap() {
this->table = new Node [HashMap::length];
for(int i = 0; i < HashMap::length; i++) {
this->table[i] = new Node;
}
}
template <class T, class S>
struct HashMap<T, S>::Node {
T value;
S key;
Node * next;
};
我正在做的研究没有告诉我错误是什么;任何帮助表示赞赏!
答案 0 :(得分:4)
你没有指针数组。你有一个节点数组。显然,你想要的是这样的:
Node ** table;
...
this->table = new Node*[this->length];
或许你实际上并不需要一个指针数组,而只需要一个节点数组。在这种情况下,除了:
之外不需要额外的初始化this->table = new Node[this->length];
除此之外,除非这是一次学习练习,否则请查看standard library,其中dynamic arrays和hash maps都已为您准备好了。
答案 1 :(得分:1)
table
不是指针数组。它是Node
s的数组(或者更确切地说,它指向Node
s的数组)。 table
的类型为Node*
; table[i]
的类型为Node
,而不是Node*
。
如果你确实想要一个指针数组,那么你需要
Node** table;
table = new Node*[length];
或者更好的是,像
vector<unique_ptr<Node>> table;
table.resize(length);
答案 2 :(得分:0)
你没有声明一个指针数组
节点*表(指向节点)
节点**表(指向数组节点)
Node** table;
table =new Node*[this->length];
for(int i=0;i<this->length;i++)
{
table[i]=new Node;
}
答案 3 :(得分:0)
this->table = new Node [HashMap::length];
this->table
的类型为Node*
,新的Node [HashMap :: length]也返回一个Node *,即创建了一个长度为HashMap::length
的节点数组,数组地址为存储在this->table
指针中。
this->table[i] = new Node;
例如,我们可以定义:
int* arr = new int[10];
这里arr的类型为int *,但arr[0]
的类型为int。
同样,this->table[i]
属于Node类型,新节点返回Node *。因此不兼容的类型。正确的行将是
this->table[i] = *new Node;
但是,这条线是不必要的,因为已经创建了节点数组并且分配了内存。在代码中使用此行将导致内存泄漏。