Мой в моем заголовочном файле DNode не распознается как тип данных - PullRequest
0 голосов
/ 24 сентября 2018

Я объявил класс узла в моем main.cpp, но когда я пытаюсь использовать узел при объявлении функций в моем заголовочном файле, он не распознает тип данных узла.

template<class E> class doublyLinkedList;  
class doublyLinkedList  
{
        public:
        doublyLinkedList();
        ~doublyLinkedList();
        bool IsEmpty() const;
        const T& front() const; // return front node
        const T& back() const; //returning rear node
        void addToFront(const T& e); // add to front
        void addToBack(const T& e); //adds to end
        void removeFront(); // remove front node
        void removeBack(); //remove rear node
private:
        DNode<T>* header; // sentinel node front of node
        DNode<T>* trailer; //sentinel node for back of node
protected:
        void add(DNode* v, const Element& e); // insert new node before v
        void remove(DNode* v); // remove node v
  };  

 template<class E> class doublyLinkedList; //forward declaration    

template <class E>  
 class DNode{
private:
        E element;      //node's actual value
        DNode<E>* head;
        DNode<E>* tail;
        template<class T> friend class doublyLinkedList;
     };  

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Предположим, ваш класс MyNode, ваша функция MyFunc(MyNode), заголовочный файл foo.h и исходный файл bar.cpp.(Это одна из причин, по которой вы должны приводить примеры в своих вопросах; если вы этого не сделаете, тогда другие люди будут называть ваши вещи.)

Естественно bar.cpp содержит следующую строку:

#include "foo.h"

Когда компилятор пытается скомпилировать bar.cpp, он встречает объявление MyFunc(MyNode X) и жалуется «Что за хрень MyNode? Я ухожу!»

Самый простойЧтобы решить эту проблему, поместите определение MyNode в foo.h выше объявления функции, которая его использует.

Лучший способ - вставить строку в foo.c:

class MyNode;

выше любого другого упоминания MyNode.(Это говорит компилятору «есть класс с именем MyNode, не волнуйтесь, что это такое, он будет предоставлен позже.) И каким-то образом (например, с помощью оператора #include) поместите определение MyNode выше любогокод, который фактически использует его.

0 голосов
/ 24 сентября 2018

Как правило, классы будут объявлены в заголовочных файлах, чтобы избежать самой проблемы, которую вы видите.Однако ничто не мешает объявить класс / структуру локально в файле body (cpp).

Если вы хотите, чтобы класс был виден другому классу, он должен быть либо полностью объявлен, либо объявлен форвардом.

class foo; // forward declaration

class bar {
    bar(foo& r):ref(r){};
    foo & ref; // Ok because of the forward declaration
    foo* ptr;  // Ok 
    //foo full;  // Not legal as the full declaration is needed. 

};

class foo{ // declaration of class
// members and methods
};

class third{
   bar b; // Ok, full declaration is available;
};
...