2016-11-24 109 views
0

我知道我不能擁有連接向量,因爲它包含的對象在那行代碼中還不存在。我無法切換訂單,因爲頂點不存在。包含另一個對象指針向量的對象

struct Vertex { 
    int key; 
    int val; 
    vector<Edge*> connections; 
    Vertex(int k) { 
     key = k; 
    } 

}; 


struct Edge { 
    Vertex *start; 
    Vertex *end; 
    int weight; 
    Edge(Vertex *s, Vertex *e, int w) { 
     start = s; 
     end = e; 
     weight = w; 
    } 
}; 

所以我的解決方案是創建一個新的對象,並在那裏放置連接。

struct Node { 
    int key; 
    int val; 
    Node(int k) { 
     key = k; 
    } 

}; 


struct Edge { 
    Node *start; 
    Node *end; 
    int weight; 
    Edge(Node *s, Node *e, int w) { 
     start = s; 
     end = e; 
     weight = w; 
    } 
}; 

struct Vertex { 
    Node node; 
    vector<Edge*> connections; 
}; 

有沒有更好的選擇,我只需要保留兩個對象而不是三個?

回答

3

你只需要前瞻性聲明Edge

struct Edge; 

struct Vertex { 
    int key; 
    int val; 
    vector<Edge*> connections; 
    Vertex(int k) { 
     key = k; 
    } 
}; 
+0

我已經遇到這個問題,我想前進存儲指向一個向量類時,因爲我認爲在內部宣佈性病足夠::向量只是保持一個指針,但在我的情況下,它不會讓我。我不知道這與分配器需要知道它的大小還是什麼有關。 – Zebrafish

+0

如果您轉發聲明容器或函數聲明中使用的指針或引用類型,則在使用它之前,仍然需要定義類型。所以這可能發生在你身上。或者你可能陷入了擁有一個具有前向聲明模板類型的std :: unique_ptr類成員而沒有明確定義析構函數的陷阱(在這種情況下,析構函數是默認的,並試圖調用「delete」前向聲明類型)。 – paddy

相關問題