2013-07-26 79 views
0

我有这个C++类,有一个名为adj的Node对象数组(我猜你不需要看到我的Node类的实现)无法编译C++代码:从'Node *'无效转换为'int'

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,并试图将其存储在第p位置adj

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; 
    } 
}; 

UPDATE:这里我不能使用C++矢量。我很想去,但这是一个家庭作业的东西。在任何人认为我是作弊之前,请注意我并没有要求解决我的特定问题,而是要解决编译代码时遇到的问题。

+0

提示:您宁愿要'std :: vector '...... – 2013-07-26 22:01:20

+0

'adj'是指向'Node'的指针。你可以使它指向一个'Nodes'数组的元素。但是你不能指向'Node *'数组的元素。 – juanchopanza

+3

显示节点 – Kevin

回答

2

adjNode*类型。 adj[someIndex]然后是Node类型。您正尝试将Node*分配给Node。我的教育猜测是,你有Node::operator=(int),所以编译器试图以这种方式解释你的代码 - 但这也不能解决问题,产生你观察到的错误信息。

+0

在C++中,它是'Node&' –

+0

@Cole Johnson:在C++中,不存在引用类型表达式这样的事情。 [5p5:如果表达式最初具有“对T的引用”类型(8.3.2,8.5.3),则在进行任何进一步分析之前将该类型调整为T.表达式指定由引用表示的对象或函数,表达式是一个左值或一个xvalue,取决于表达式。]'adj [someIndex]'即使最初也不是引用类型。 –

+0

哎呦。我的错。我在想如果你调用一个带'Node&'的函数。 –

6

adj[p++]的类型显然是Node&并且您尝试将Node*指定给它。我想,你的Node类型有一个构造函数采取int和编译器尝试但无法将Node*转换为int

你大概意思申报adj作为

std::vector<Node*> adj; 

...然后使用,如添加新节点:

adj.push_back(nod); 

(注意,你还需要确保分配的对象在适当的时间点发布)。

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; 
    } 

如果你真的坚持要使用数组语法访问链表的元素(坏主意在我的脑海里,因为它只是增加了潜在的混乱,但情况因人而异),你可以像

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; 
    } 

分享和享受的实现,。

1

后您创建了新的Node

Node *nod = new Node(value); 

,你需要把它挂到你的链接列表。链表的样子:

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

其中HEAD你的情况是adj

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

也就是说,你应该结束了,像这样:

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

其中adj'adj旧值。

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

然后你需要弄清楚如何遍历列表中的节点。

此外,不要忘记清理Graph析构函数中的节点(并小心如何做到这一点)。