c++ - clase no declarada en el alcance-a pesar de que se incluyó.h
scope include (1)
soy relativamente nuevo en C ++ y me encuentro con un problema extraño,
Me aparece "ToDoItem no fue declarado en este ámbito", pero he incluido el archivo todoitem.h
el error está en esta definición de clase:
#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
y el todoitem.h es:
#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
El problema de circular común incluye que ocurre con:
ah
#ifndef A_H
#define A_H
#include "b.h"
// do something requiring content from b.h
#endif
bh
#ifndef B_H
#define B_H
#include "a.h"
// whatever
#endif
Si algún cpp incluye "ah", puede salirse con la suya (si bh realmente no necesita ah). Pero si ese cpp en su lugar incluye bh, entonces bh incluye ah ANTES de declarar las cosas necesarias por ah Entonces ah intenta incluir bh pero el protector de inclusión bloquea eso, por lo que el compilador procesa ah sin las declaraciones de bh y falla.
Ese problema común suele estar enmascarado por otra capa, como lo fue en su ejemplo: todoitem.h incluía "todolist.h", aunque realmente no lo necesitaba, entonces "todolist.h" incluía "intemmonitor.h" que necesitó "todoitem.h" pero no pudo incluirlo debido al protector de inclusión.