无法编译C ++代码:从“Node *”到“int”的无效转换

时间:2013-07-26 21:59:29

标签: c++ arrays object

我有一个C ++类,其中包含一个名为adj的Node对象数组(我想你不需要看到我的Node类的实现)

class Graph {
public:
    Node *adj;
    bool *marked;
    int nVertex, p;
    int *distance;

    void graph(int quantity);
    bool is_marked();

    void cleaner();
    void newVertex(int value);
};

我有这个创建节点nod并尝试将其存储在adj中的第p个位置的方法:

void Graph::newVertex(int value)
{
    Node *nod = new Node(value);
    adj[p++] = nod;
}

当我尝试编译此代码时,我收到以下错误消息:

invalid conversion from 'Node*' to 'int'

我无法在代码中看到我做错了什么。数组初始化看起来对我和对象赋值也是正确的。请帮我回答这个问题。

更新:Node类的代码:

class Node {
public:
    int value, cost;
    Node *next;

    Node() {}

    Node(int val) {
        value = val;
        next = NULL;
        cost = 0;
    }
};

更新:我不能在这里使用C ++ vector。我很乐意,但这是为了做作业。在有人认为我在作弊之前,请注意我并不是要求解决我的具体指定问题,而是要解决我编写代码时出现的问题。

4 个答案:

答案 0 :(得分:6)

adj[p++]的类型显然是Node&,您尝试为其分配Node*。我猜,您的Node类型的构造函数采用int并且编译器尝试但未能将Node*转换为int

您可能打算将adj声明为

std::vector<Node*> adj;

...然后使用例如:

添加新节点
adj.push_back(nod);

(注意,你仍然需要确保在适当的时间点释放分配的对象。)

答案 1 :(得分:2)

adj的类型为Node*adj[someIndex]的类型为Node。您正尝试将Node*分配给Node。我的有根据的猜测是,你有Node::operator=(int),所以编译器试图以这种方式解释你的代码 - 但这也不成功,产​​生你观察到的错误信息。

答案 2 :(得分:1)

好的,手头上有Node课程的定义,我想我可以看到你想要做的事情。如果我是正确的,您希望Graph::adj指向Node个元素的链接列表,每个Node然后指向列表中的下一个Node。如果这是正确的,new_vertex的实现需要看起来像:

void Graph::newVertex(int value)
  {
  Node *nod = new Node(value);
  nod->next = adj;
  adj = nod;
  }

无需索引(p) - 您只需使用类似于

的代码遍历Node元素的链接列表
Node *n = adj;

while(n != NULL)
  {
  // do something useful with n

  n = n->next;
  }

如果你真的坚持使用数组语法来访问链表的元素(在我看来是个坏主意,因为它只会增加潜在的混淆,但是YMMV)你可以添加像

这样的东西
Node *operator[](int n);  // 0-based index into Node list

Graph,其实现类似于

Node *operator[](int ndx)
  {
  Node *n = adj;

  for( ; n != NULL, ndx > 0 ; ndx--)
    n = n->next;

  return n;
  }

分享并享受,。

答案 3 :(得分:1)

创建新Node后:

Node *nod = new Node(value);

您需要将其连接到链接列表。链表如下:

[HEAD] => [value|next] => [value|next] => NULL

您的案例中HEADadj

因此,您需要更新新节点的下一个节点以指向当前头节点,然后更新头节点以指向新节点。

也就是说,你应该得到类似的东西:

adj => [value|next] => [value|next] => ... => NULL
       ^               ^
       nod             adj'

其中adj'adj的旧值。

它有助于创建数据结构外观以及值如何更新的图表。

然后,您需要确定如何遍历列表中的节点。

另外,不要忘记清理Graph析构函数中的节点(并注意如何执行此操作)。

相关问题