我正在接受我正在处理的Qt应用程序中没有类型错误的禁止声明。问题是我已经包含了声明该类的头文件。据我所知,它应该被定义为一种类型。我也尝试了前向声明,但是我想在这个文件中使用类的方法,所以我需要整个头文件。 代码:
Shapes.h
#ifndef SHAPES_H
#define SHAPES_H
#include "Colors.h"
#include <QPoint>
#include "glwidget.h"
//class GLWidget;
class Shape
{
public:
virtual void draw();
};
class Rectangle : public Shape
{
public:
Rectangle(GLWidget *w, QPoint tl, QPoint br);
virtual void draw(){
// top horizontal
for(int i = topLeft.x(); i < btmRight.x(); i++){
glWidget->setPixel(i,topLeft.y(), color);
}
}
private:
QPoint topLeft,btmRight;
GLWidget *glWidget; /**** This is the Error line ****/
RGBColor color;
};
#endif // SHAPES_H
glwidget.h:
#ifndef AGLWIDGET_H
#define AGLWIDGET_H
#include <QGLWidget>
#include "Colors.h"
#include "Shapes.h"
class GLWidget : public QGLWidget
{
Q_OBJECT
public:
GLWidget(QWidget *parent = 0);
~GLWidget();
QSize minimumSizeHint() const;
QSize sizeHint() const;
void setPixel(int x, int y, RGBColor c);
public slots:
void setColor(RGBColor c);
void setDrawRectangle();
protected:
void initializeGL();
void paintGL();
void resizeGL(int width, int height);
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
private:
QPoint lastPos;
QVector<QPoint> drawPoints;
RGBColor paintColor;
int drawmode;
Shape *currentShape;
};
#endif
我不明白为什么我不能在Shapes.h中使用我的GLWidget。错误发生在我宣布GLWidget * glWidget的行的Shapes.h中; 如果我使用前向声明即。 class GLWidget;这个错误消失但我实际上不能像在Rectangle.draw()
中那样使用GLWidget方法任何人都知道为什么编译器不会在Shapes.h中看到GLWidget是一个类型?
确切错误:
Shapes.h:20:错误:预期')'在'*'标记之前
Shapes.h:31:错误:ISO C ++禁止声明没有类型的'GLWidget'
Shapes.h:31:错误:预期';'在'*'标记之前
Shapes.h:在成员函数'virtual void Rectangle :: draw()'中:
Shapes.h:25:错误:'glWidget'未声明(首先使用此功能)
Shapes.h:25:错误:(每个未声明的标识符仅针对它出现的每个函数报告一次。)
答案 0 :(得分:7)
您的头文件之间存在循环依赖关系 - Shapes.h包含glwidget.h,它再次包含Shapes.h。因此,第二次编译器尝试包含glwidget.h时,已经定义了包含保护AGLWIDGET_H
,因此它不再包含它,然后是Shapes.h中的代码尝试使用应该声明但不是声明的类型。
要修复它,您需要删除其中一个依赖项并改为使用前向声明。由于glwidget.h实际上并没有使用Shape
类而不是声明指针成员变量,所以你应该删除它包含Shapes.h:
glwidget.h:
#ifndef AGLWIDGET_H
#define AGLWIDGET_H
// do NOT include Shapes.h
class Shape; // forward declaration
class GLWidget : public QGLWidget
{
...
Shape *currentShape;
};
#endif
Shapes.h与以前相同:
#ifndef SHAPES_H
#define SHAPES_H
#include "glwidget.h"
...
#endif
答案 1 :(得分:1)
原因是包含顺序 - 您使用循环包含,只有包含防护措施阻止您循环编译器。
您可以通过在glWidget.h中向前声明shape类并删除Shapes.h的include来解决这个问题:
//#include "Shapes.h"
class Shape;