2013-07-26 84 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析構函數中的節點(並小心如何做到這一點)。