尽管包含.h,但未在中声明类

class not declared in even though .h was included

本文关键字:声明 包含      更新时间:2023-10-16

我对c++还比较陌生,遇到了一个奇怪的问题,

我得到了"ToDoItem没有在这个范围内声明",但我已经包含了ToDoItem.h文件

错误在这个类定义中:

#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

todoitem.h是:

#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

常见的循环包含问题发生在:
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  

如果某个cpp包含"a.h",你可能会逃脱惩罚(如果b.h并不真的需要a.h)。但如果该cpp包含b.h,那么b.h包含a.hBEFORE声明a.h所需的东西。然后a.h尝试包含b.h但include保护块阻止了它,因此编译器在不包含b.h声明的情况下处理a.h,并失败。

这个常见的问题通常被另一层掩盖,就像在你的例子中一样:todoitem.h包含了"todolist.h",尽管它并不真正需要它,但"todolest.h"包含了"intermmonitor.h",它需要"todoitem.h",但由于include保护而未能包含它。

请确保检查每个标头是否具有唯一的#define值。

当复制头文件但忘记将#define HEADER_H更改为唯一标识符时,可能会发生这种情况,因此即使您#include也会阻止包含新的头文件。