2017-09-28 20 views
-2

我對C++比較陌生。我正在嘗試創建一個圖類。我嘗試創建圖形構造頂點的向量,但我發現一個未定義的標識符錯誤,當我打電話Vector.push_back把一個對象放入一個向量中,未定義的標識符

#include <iostream> 
#include <string> 
#include <vector> 

class Graph { 
public: Graph(int vertexNum) { 
    for (int i = 0; i < vertexNum - 1; i++) 
     Vertex vert(i); 
     this->vertexList.push_back(vert); 
    } 
    private: 
    class Vertex { 
     public: 
     Vertex(int vertexId) { 
      this->vertId = vertexId; 
     } 
     int vertId; 
    }; 


    std::vector<Vertex> vertexList; 
}; 

我敢肯定有代碼其他邏輯的錯誤,我的天堂目前還沒有確定,我仍在努力,但我想知道我在做什麼錯誤的向量。

下面是錯誤discriptions:

標識符 「VERT」 未定義的Dijkstra的main.cpp 9
'VERT':未聲明的標識符的Dijkstra的main.cpp 9

+2

請[請閱讀如何提出良好問題](http://stackoverflow.com/help/how-to-ask),並編輯您的問題,以包括[最小,完整和可驗證示例](http: //stackoverflow.com/help/mcve)。同時顯示使用*實際*錯誤,複製粘貼爲文本,完整且無需修改。 –

+0

如果你有幾個錯誤,總是從解決第一個錯誤開始。 C++錯誤有導致其他錯誤級聯的傾向,這是第一種錯誤的副作用。 – molbdnilo

+0

你試圖調用'Vector.push_back()'函數的哪部分代碼?你怎麼打電話呢?用哪個參數?可能有很多原因會導致未定義的標識符錯誤。你能告訴我們更多你的代碼嗎? – Actarus

回答

1

在C++中,然後纔可以使用可變您甚至需要在類定義中聲明它,只需將std :: vector的聲明移到使用它的構造函數上方即可解決該錯誤。這就是爲什麼人們通常爲這個類創建一個頭,這樣所有的聲明都在它裏面完成,並且.cpp包含了實現。同樣,你需要爲頂點類和邊類做同樣的事情。另外,Graph的實現依賴於Vertex類的存在,所以Vertex類需要在Graph實現之前聲明和實現。此外,更重要的是,您忘記在for循環中放置大括號(這是主要問題)

#include <iostream> 
#include <string> 
#include <vector> 
    class Graph { 
     private: 
     class Vertex { 
      public: 
      int vertId; 
      Vertex(int vertexId) { 
       this->vertId = vertexId; 
      } 

     }; 

     class Edge { 
      public: 
       Vertex* start; 
       Vertex* end; 
       int weight; 
       Edge(Vertex* start, Vertex* end, int weight) { 
        this->start = start; 
        this->end = end; 
        this->weight = weight; 
       } 

     }; 

     public: 
     std::vector<Vertex> vertexList; 
     Graph(int vertexNum) { 
     for (int i = 0; i < vertexNum - 1; i++) { 
      Vertex vert(i); 
      this->vertexList.push_back(vert); 
      } 
     } 
    }; 
+0

非常感謝!你是對的,大括號解決了問題。最近我一直在寫很多python,它完全放棄了我的想法。我應該將Vertex和Edge分成不同的類,還是將Graph分解爲.h和.cpp工作? – fkInTheCoffee

+0

將類拆分爲h和cpp會使代碼更易於閱讀,如果不將它們拆分,如果多次將該類包含在其他對象文件中,則在編譯期間將會出現多個定義錯誤。所以最好的做法是把它分開以避免這種情況。我可以在那裏獲得投票嗎? –

1

這是縮進很重要的情況。你不必在你的括號for循環,所以它的理解像

for (int i = 0; i < vertexNum - 1; i++) { 
    Vertex vert(i); 
} 
this->vertexList.push_back(vert); 

凡現在是有道理的,vert沒有定義。