2016-11-28 72 views
0

之前,我有這兩個類,我想邊緣節點要的朋友圖形,但我不知道如何聲明它如何聲明一個類朋友另一其定義

圖的實施基於鄰接列表,我使用unique_ptr進行自動刪除。

#ifndef GRAPH_HPP 
#define GRAPH_HPP 

#include <memory> 
using std::unique_ptr; 

template<typename Type> 
class edgenode { 
    friend class graph<Type>; //here 
public: 
    edgenode(Type w, int adj); 
    ~edgenode() {}; 
private: 
    Type       mWeight; 
    int        mAdj; 
    unique_ptr<edgenode<Type>>  mNext; 
}; 

template<typename Type> 
edgenode<Type>::edgenode(Type w, int adj) 
    :mWeight(Type), mAdj(adj) { 
    mNext = nullptr; 
} 

///-------------------------------------------------/// 

template<typename Type> 
class graph { 
public: 
    graph(int maxvertices = 1000, bool directed = false); 
    ~graph(); 
private: 
    unique_ptr<edgenode<Type>>* mEdges; 
    int*      mDegree; 
    int       mNoOfNodes; 
    int       mNoOfVertices; 
    int       mSize; 
    bool      m_bDirected; 
}; 

template<typename Type> 
graph<Type>::graph(int maxvertices = 1000, bool directed = false) 
    : mSize(maxvertices), 
    m_bDirected(directed), 
    mNoOfNodes(0), 
    mNoOfVertices(0) 
{ 
    mDegree = new int[mSize]; 
    mEdges = new unique_ptr<edgenode<Type>>[mSize]; 


    for (int i = 0; i < mSize; ++i) { 
     mDegree[i] = 0; 
     mEdges[i] = nullptr; 
    } 
} 

template<typename Type> 
graph<Type>::~graph() { 
    delete[] mEdges; 
    delete[] mDegree; 
} 
#endif 
+0

正向聲明'graph',或只是改變聲明的順序。 – AndyG

+0

小案子會更好。對於答案,只需放入'template 朋友類圖;' –

+0

同樣嘗試遵循使用UpperCase作爲類名稱的約定,例如,圖形,EdgeNode – Roberto

回答

1

轉發聲明類模板是這樣的:

template<typename Type> class graph; 

template<typename Type> 
class edgenode { 
    friend graph<Type>; 
    // ... 
0

edgenode聲明之前添加template class graph<class T>;,這就是所謂的正向聲明:

#include <memory> 
using std::unique_ptr; 

template class graph<class T>; // this 

template<typename Type> 
class edgenode { 
    friend class graph<Type>; //here 
public: 
    ... 
相關問題