klasse niet gedeclareerd in scope – ook al was .h inbegrepen

ik ben relatief nieuw in c++ en ik loop tegen een vreemd probleem aan,

Ik krijg “ToDoItem is niet gedeclareerd in deze scope”, maar ik heb het bestand todoitem.h toegevoegd

de fout zit in deze klassedefinitie:

#ifndef ITEMMONITOR_H
#define ITEMMONITOR_H
#include <QObject>
#include <QPointer>
#include <QTimer>
#include "todoitem.h"
class ItemMonitor : public QObject{
    Q_OBJECT
    signals:
        void finished();
    public:
        explicit ItemMonitor(std::vector< QPointer<ToDoItem> >&  items_);
    private:
        std::vector< QPointer<ToDoItem> >& items;
        bool shouldRun;
    public slots:
        void beginMonitoring();
        void finishUp();
};
#endif // ITEMMONITOR_H

en de todoitem.h is:

#ifndef TODOITEM_H
#define TODOITEM_H
#include <string>
#include <QString>
#include <QPushButton>
#include <QFrame>
#include <QDateTime>
#include "todolist.h"
namespace Ui {
    class ToDoItem;
}
class ToDoItem : public QFrame{
    Q_OBJECT
    public:
        //constructor and destructor
        explicit ToDoItem(QFrame *parent = 0);
        ~ToDoItem();
        //functions
        void setValues(QString mainText_,          // sets all import
                   QString additionalText_,
                   QDateTime dateTime_,
                   bool hasDeadline_);
        void paintEvent(QPaintEvent *pe);          //added to support stylesheets
        void setDeadline(QDateTime deadline_);
        QDateTime getDeadline();
        bool getHasDeadline();
        void setId(int id_);
        int getId();
        void setSecsTillDeadline();
        int getSecsTillDeadline();
        bool getSorted();
        void setSorted(bool sorted_);
        QString getMainText();
    private:
        QString formatTime(int duration_);
        Ui::ToDoItem *ui;
        int id;
        QDateTime deadline;
        bool hasDeadline;
        int secsTillDeadline;
        bool sorted;                               // set to true only during the sorting process
};
#endif // TODOITEM_H

Antwoord 1, autoriteit 100%

Het veelvoorkomende circulaire include-probleem doet zich voor bij:
a.h

#ifndef A_H
#define A_H
#include "b.h"
// do something requiring content from b.h
#endif  

b.h

#ifndef B_H
#define B_H
#include "a.h"
// whatever
#endif  

Als sommige cpp “a.h” bevatten, kom je er misschien mee weg (als b.h niet echt a.h nodig had). Maar als die cpp in plaats daarvan b.h bevat, dan bevat b.h a.h VOORdingen aan te geven die nodig zijn voor a.h. Dan probeert a.h b.h op te nemen, maar de include guard blokkeert dat, dus de compiler verwerkt a.h zonder de verklaringen van b.h en faalt.

Dat veelvoorkomende probleem wordt vaak gemaskeerd door een andere laag, zoals in uw voorbeeld: todoitem.h bevatte “todolist.h”, hoewel het het niet echt nodig had, en “todolist.h” omvatte “intemmonitor. h” die “todoitem.h” nodig had maar het niet kon opnemen vanwege de include-beveiliging.


Antwoord 2, autoriteit 33%

Controleer of aan elke kop een unieke #define-waarde is gekoppeld.

Dit kan gebeuren bij het dupliceren van een header-bestand maar vergeten om de #define HEADER_Hte wijzigen in een unieke identifier, en dus zal de bewaker voorkomen dat het nieuwe header-bestand wordt opgenomen, zelfs als u #includehet.

Other episodes