无法编译C++;代码:从';节点*';至';int'; 我有一个C++类,它有一个节点对象数组,叫做“代码> adj< /Cl>”(我猜您不需要看到我的节点类的实现)
我有一个方法,它创建一个节点无法编译C++;代码:从';节点*';至';int'; 我有一个C++类,它有一个节点对象数组,叫做“代码> adj< /Cl>”(我猜您不需要看到我的节点类的实现),c++,arrays,object,C++,Arrays,Object,我有一个方法,它创建一个节点nod,并尝试将其存储在adj中的第p个位置: void Graph::newVertex(int value) { Node *nod = new Node(value); adj[p++] = nod; } 当我尝试编译此代码时,会收到以下错误消息: 从“Node*”到“int”的转换无效 我看不出我在代码中做错了什么。数组初始化在我看来是正确的,对象分配也是正确的。请帮我回答这个问题 更新:节点类的代码: class Node { public
nod
,并尝试将其存储在adj
中的第p个位置:
void Graph::newVertex(int value)
{
Node *nod = new Node(value);
adj[p++] = nod;
}
当我尝试编译此代码时,会收到以下错误消息:
从“Node*”到“int”的转换无效
我看不出我在代码中做错了什么。数组初始化在我看来是正确的,对象分配也是正确的。请帮我回答这个问题
更新:节点
类的代码:
class Node {
public:
int value, cost;
Node *next;
Node() {}
Node(int val) {
value = val;
next = NULL;
cost = 0;
}
};
更新:这里不能使用C++向量。我很想去,但这是为了家庭作业。在任何人认为我在作弊或做其他事情之前,请注意,我不是在要求解决我指定的特定问题,而是在要求解决编译代码时遇到的问题。
adj
属于Node*
类型adj[someIndex]
则属于Node
类型。您正在尝试将节点*
分配给节点
。我的猜测是,您有Node::operator=(int)
,因此编译器试图以这种方式解释您的代码-但这也不起作用,产生您观察到的错误消息。adj[p++]的类型显然是节点&
,您尝试为其分配节点*
。我猜,您的节点
类型有一个构造函数采用int
,编译器尝试将节点*
转换为int
你可能想把adj
声明为
std::vector<Node*> adj;
(请注意,您仍然需要确保在适当的时间点释放分配的对象)。好的,有了
节点的定义,我想我可以看到您正在尝试做什么。如果我是正确的,您希望让Graph::adj
指向节点
元素的链接列表,每个节点
然后指向列表中的下一个节点
。如果这是正确的,new\u vertex
的实现需要如下所示:
void Graph::newVertex(int value)
{
Node *nod = new Node(value);
nod->next = adj;
adj = nod;
}
adj => [value|next] => [value|next] => ... => NULL
^ ^
nod adj'
不需要索引(p
)-只需遍历节点
元素的链接列表,代码类似于
Node *n = adj;
while(n != NULL)
{
// do something useful with n
n = n->next;
}
Node *operator[](int ndx)
{
Node *n = adj;
for( ; n != NULL, ndx > 0 ; ndx--)
n = n->next;
return n;
}
如果您真的坚持使用数组语法访问链表的元素(在我看来,这是个坏主意,因为它只会增加潜在的混乱,但是YMMV),您可以添加如下内容
Node *operator[](int n); // 0-based index into Node list
使用类似于
Node *n = adj;
while(n != NULL)
{
// do something useful with n
n = n->next;
}
Node *operator[](int ndx)
{
Node *n = adj;
for( ; n != NULL, ndx > 0 ; ndx--)
n = n->next;
return n;
}
创建新的节点后,请共享并享受。:
Node *nod = new Node(value);
你需要把它连接到你的链表上。链接列表如下所示:
[HEAD] => [value|next] => [value|next] => NULL
在你的例子中,HEAD
应该是adj
因此,您需要更新新节点的下一个节点以指向当前头部节点,然后更新头部节点以指向新节点
也就是说,你应该得到如下结果:
void Graph::newVertex(int value)
{
Node *nod = new Node(value);
nod->next = adj;
adj = nod;
}
adj => [value|next] => [value|next] => ... => NULL
^ ^
nod adj'
其中adj'
是adj
的旧值
它有助于创建数据结构的外观以及如何更新值的图表
然后需要了解如何遍历列表中的节点
另外,不要忘了清理图
析构函数中的节点(注意如何操作)。提示:您更希望std::vector
。adj
是指向节点
的指针。您可能可以将其指向节点数组的一个元素。但是你不能让它指向Node*
数组的元素。显示Node的构造函数“…在adj
中的第p位”adj
被声明为Node*
,而不是数组或类似的东西。你的意思是将adj
声明为Node**adj
还是Node*adj[10]
或其他类似的数组?哦,我明白了。看起来我还不知道C/C++数组。刚刚更新到节点**adj代码>和to*adj=新节点[数量+1]代码>在我的图中
构造函数中,一切正常@Cole Johnson:在C++中,没有一个引用类型的表达式。[5p5:如果一个表达式最初具有类型“reference to T”(8.3.2,8.5.3),则在进行任何进一步分析之前,该类型将调整为T。该表达式指定由引用表示的对象或函数,该表达式是左值或X值,具体取决于表达式。]adj[someIndex]
最初也不是参考类型。哎呀。我的错误。我在想,如果你调用一个函数,它接受一个节点&
。