2016-11-28 5 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 friend,' –

+0

Также попробуйте следовать соглашению об использовании UpperCase для имен классов, например. График, EdgeNode – Roberto

ответ

1

вперед объявить шаблон класса, как это:

template<typename Type> class graph; 

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

Добавить template class graph<class T>; до объявления edgenode, это называется опережающее объявление:

#include <memory> 
using std::unique_ptr; 

template class graph<class T>; // this 

template<typename Type> 
class edgenode { 
    friend class graph<Type>; //here 
public: 
    ... 
Смежные вопросы