2015-12-05 4 views
0

У меня возникли проблемы с этими узлами, которые я пытаюсь наследовать. Я просмотрел множество примеров в Интернете, но не могу понять, что я делаю неправильно.Синтаксическая ошибка в наследовании

Мой компилятор дает мне эти сообщения:

error: expected identifier before 'public' 
error: expected '{' before 'public' 
error: expected unqualified-id before 'public' 

Любая помощь будет высоко ценится :)

template <typename T> 
class Node 
{ 
    protected: 
     Node<T>* next; 
     Node<T>* prev; 
     T* data; 
    public: 
     Node(); 
     ~Node(); 
     Node* getNext(); 
     Node* getPrev(); 
     void setNext(Node<T>*); 
     void setPrev(Node<T>*); 
     T* getData(); 
     void setData(T*); 
}; 
template <typename T> 
class HeadNode : public Node<T> 
{ 
    public: 
     HeadNode(); 
     ~HeadNode(); 
}; 
template <typename T> 
class TailNode : public Node<T> 
{ 
    public: 
     TailNode(Node<T>*); 
     ~TailNode(); 
}; 
template <typename T> 
class InternalNode : public Node<T> 
{ 
    public: 
     InternalNode(Node<T>*, Node<T>*, T*); 
     ~InternalNode(); 
}; 

template <typename T> 
Node<T>::Node() 
{ 
    next = 0; 
    prev = 0; 
    data = 0; 
} 
template <typename T> 
Node<T>::~Node() 
{ 
    //delete data; 
} 
template <typename T> 
Node<T>* Node<T>::getNext() 
{ 
    return next; 
} 
template <typename T> 
Node<T>* Node<T>::getPrev() 
{ 
    return prev; 
} 
template <typename T> 
void Node<T>::setNext(Node<T>* n) 
{ 
    next = n; 
} 
template <typename T> 
void Node<T>::setPrev(Node<T>* n) 
{ 
    prev = n; 
} 
template <typename T> 
T* Node<T>::getData() 
{ 
    return data; 
} 
template <typename T> 
void Node<T>::setData(T* nData) 
{ 
    delete data; 
    data = nData; 
} 
template <typename T> 
HeadNode<T>::HeadNode() : public Node<T>() 
{ 
    next = new TailNode<T>(this); 
} 
template <typename T> 
HeadNode<T>::~HeadNode() 
{ 
} 
template <typename T> 
TailNode<T>::TailNode(Node<T>* p) : public Node<T>() 
{ 
    prev = p; 
} 
template <typename T> 
TailNode<T>::~TailNode() 
{ 
} 
template <typename T> 
InternalNode<T>::InternalNode(Node<T>* n, Node<T>* p, T* nData):   public Node<T>() 
{ 
    next = n; 
    prev = p; 
    data = nData; 
} 
template <typename T> 
InternalNode<T>::~InternalNode() 
{ 
    //delete data; 
} 
+0

Может не воспроизводить, проголосовали за закрытие. –

+0

О, извините, я не копировал весь источник. Убирается с закрытым голосованием. –

ответ

0

Я не так хорошо на C++, но это прошло компилятор.

  • удалить public из инициализации в конструкторах
  • добавить Node<T>:: где дочерние классы хотят использовать член родительского класса
  • добавить virtual в деструктор Node так что деструкторы дочерних классов будут называться по удалению

template <typename T> 
class Node 
{ 
    protected: 
     Node<T>* next; 
     Node<T>* prev; 
     T* data; 
    public: 
     Node(); 
     virtual ~Node(); // add virtual 
     Node* getNext(); 
     Node* getPrev(); 
     void setNext(Node<T>*); 
     void setPrev(Node<T>*); 
     T* getData(); 
     void setData(T*); 
}; 
template <typename T> 
class HeadNode : public Node<T> 
{ 
    public: 
     HeadNode(); 
     ~HeadNode(); 
}; 
template <typename T> 
class TailNode : public Node<T> 
{ 
    public: 
     TailNode(Node<T>*); 
     ~TailNode(); 
}; 
template <typename T> 
class InternalNode : public Node<T> 
{ 
    public: 
     InternalNode(Node<T>*, Node<T>*, T*); 
     ~InternalNode(); 
}; 

template <typename T> 
Node<T>::Node() 
{ 
    next = 0; 
    prev = 0; 
    data = 0; 
} 
template <typename T> 
Node<T>::~Node() 
{ 
    //delete data; 
} 
template <typename T> 
Node<T>* Node<T>::getNext() 
{ 
    return next; 
} 
template <typename T> 
Node<T>* Node<T>::getPrev() 
{ 
    return prev; 
} 
template <typename T> 
void Node<T>::setNext(Node<T>* n) 
{ 
    next = n; 
} 
template <typename T> 
void Node<T>::setPrev(Node<T>* n) 
{ 
    prev = n; 
} 
template <typename T> 
T* Node<T>::getData() 
{ 
    return data; 
} 
template <typename T> 
void Node<T>::setData(T* nData) 
{ 
    delete data; 
    data = nData; 
} 
template <typename T> 
HeadNode<T>::HeadNode() : Node<T>() // remove public 
{ 
    Node<T>::next = new TailNode<T>(this); // add Node<T>:: 
} 
template <typename T> 
HeadNode<T>::~HeadNode() 
{ 
} 
template <typename T> 
TailNode<T>::TailNode(Node<T>* p) : Node<T>() // remove public 
{ 
    Node<T>::prev = p; // add Node<T>:: 
} 
template <typename T> 
TailNode<T>::~TailNode() 
{ 
} 
template <typename T> 
InternalNode<T>::InternalNode(Node<T>* n, Node<T>* p, T* nData): Node<T>() // remove public 
{ 
    Node<T>::next = n; // add Node<T>:: 
    Node<T>::prev = p; // add Node<T>:: 
    Node<T>::data = nData; // add Node<T>:: 
} 
template <typename T> 
InternalNode<T>::~InternalNode() 
{ 
    //delete data; 
} 
+0

Это работало ура, плюс хорошее внушение о деструкторе :) – kujel

Смежные вопросы