«не было объявлено в этой области» в c ++ - PullRequest
0 голосов
/ 15 октября 2018

Это мой заголовочный файл

#ifndef LinkedList_H
#define LinkedList_H

#include <iostream>
#include "Node.h"

class LinkedList {
    public:
    int length;
    // pointer to the first element of LinkedList
    Node *head = 0;
    // pointer to the last element of LinkedList
    Node *tail = 0;

    LinkedList();

    ~LinkedList();
};

#endif

, а это мой файл .cpp

#include "LinkedList.h"

using namespace std;

LinkedList::LinkedList() {
    head=tail;
    this->length=0;
}

LinkedList::~LinkedList() {
    Node *current = head;
    while(current!=NULL){
        Node *temp = current;
        current=current->next;
        delete temp;
    }
}

void add(string _name, float _amount){
    Node *node = new Node(_name, _amount);
    while(head==NULL){ //here, there is an error.
        head=node;
        head->next=tail;
    }
}
int main(){
    LinkedList *list = new LinkedList();
    add("Adam", 7);
    cout<<list->head<<endl;
}

В моем файле .cpp, когда я хочу попробовать добавить функцию, онвыдает ошибку в условии цикла while в функции add.Там написано, что "голова не была объявлена ​​в этом объеме".Но я объявил в .h файле.Я не мог понять, что не так.

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Скорее всего, проблема круговая включает.У вас, вероятно, есть Node.h, включая LinkedList.h и наоборот.Это приводит к (по существу) парадоксу: если оба определения классов требуют другого, какой из этих двух определен первым в любой заданной единице компиляции?

На практике вы включаете Node.h, который затем пытается включитьLinkedList.h еще раз (обратите внимание, что #include буквально означает "скопировать и вставить этот файл сюда" в компилятор), но на этом этапе LinkedList_H уже определено (потому что это то, откуда вы пришли), и включение не имеет никакого эффекта.Так что теперь вы находитесь в середине Node.h, но без предварительного определения LinkedList и получаете «не объявленные» ошибки.

Решение состоит в том, чтобы удалить #include Node.h в LinkedList.h и заменить егос предварительным объявлением, поскольку определение LinkedList в заголовке не должно знать ничего больше, чем «класс Node существует» (поскольку он использует только указатели).

0 голосов
/ 15 октября 2018

Вы должны использовать оператор области действия разрешения, как вы это делали для конструктора и деструктора.

Итак, вы в своем исходном файле сделаете следующее:

void LinkedList::add(string _name, float _amount) {

И затем,конечно, объявите эту функцию внутри вашего класса, в заголовочном файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...