2013-12-22 183 views
0

我試圖訪問我的嵌套類,所以我可以在這個函數返回的對象:如何創建嵌套類的對象?

Graph::Edge Graph::get_adj(int i) 
{ 
    Graph::Edge v; 
    int count = 0; 
    for(list<Edge>::iterator iterator = adjList[i].begin(); count <= i ;++iterator) 
    { 
     v.m_vertex = iterator->m_vertex; 
     v.m_weight = iterator->m_weight; 
    } 
    return v; 
} 

不要擔心for循環(它應該theoreticly工作)我的主要問題是與申報對象Graph::Edge v;它不工作!這是錯誤我得到:

$ make -f makefile.txt 
g++ -Wall -W -pedantic -g -c Graph.cpp 
Graph.cpp: In member function `Graph::Edge Graph::get_adj(int)': 
Graph.cpp:124: error: no matching function for call to `Graph::Edge::Edge()' 
Graph.cpp:43: note: candidates are: Graph::Edge::Edge(const Graph::Edge&) 
Graph.h:27: note:     Graph::Edge::Edge(std::string, int) 
makefile.txt:9: recipe for target `Graph.o' failed 
make: *** [Graph.o] Error 1 

我要訪問的

Graph.h:27: note:     Graph::Edge::Edge(std::string, int) 

下面是我的類圖中聲明:(我拿出的功能和一些東西簡單,並使其更易於閱讀) *

class Graph 
{ 
private: 
    vector< list<Edge> > adjList; 
public: 
    Graph(); 
    ~Graph(); 
    class Edge 
    { 
    public: 
     Edge(string vertex, int weight) 
     { 
      m_vertex = vertex; 
      m_weight = weight; 
     } 
     ~Edge(){} 
     string m_vertex; 
     int m_weight; 
    }; 

    vector < list <Edge> > get_adjList(){return adjList;} 
    //Other functions.... 

}; 

基本上,所有我需要知道的是申報邊緣的物體在此功能的正確方法。我真的很困惑,不知道除了Graph :: Edge v以外還有什麼可以做的事情;

+0

我不理解'get_adj(i)'的含義,是否應該返回頂點「i」的鄰接列表的全部或鄰居列表中的某個未指定*頂點的鄰接列表的第i個鄰接項?我假設你的'adjList'是一個每個頂點鄰接列表的acutally,這意味着'adjList [i]'包含頂點'i'的鄰接點。 – leemes

回答

4

Graph::Edge沒有默認構造函數(不帶參數的構造函數) - 它只有一個構造函數,它需要stringint。要麼你需要給一個默認的構造函數,像這樣:

Edge() 
{ 
    // ... 
} 

,或通過string和構造對象時int

Graph::Edge v("foo", 1); 
3

你的問題是,你聲明中的邊緣構造類(Edge(string vertex, int weight)),因此你沒有默認的構造函數。當您嘗試創建邊緣類的實例(您使用Graph::Edge v)時,它會嘗試調用此默認構造函數。

您需要明確聲明Edge()默認構造函數或使用您創建的構造函數聲明變量。