Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法编译C++;代码:从';节点*';至';int'; 我有一个C++类,它有一个节点对象数组,叫做“代码> adj< /Cl>”(我猜您不需要看到我的节点类的实现)_C++_Arrays_Object - Fatal编程技术网

无法编译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]
最初也不是参考类型。哎呀。我的错误。我在想,如果你调用一个函数,它接受一个
节点&