Qt ISO C++禁止声明没有类型 - 包含头文件?

wal*_*cer 1 c++ qt

我正在接受一个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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我不能在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:错误:(每个未声明的标识符仅针对它出现的每个函数报告一次.)

Ada*_*eld 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
Run Code Online (Sandbox Code Playgroud)

Shapes.h与以前相同:

#ifndef SHAPES_H
#define SHAPES_H

#include "glwidget.h"
...
#endif
Run Code Online (Sandbox Code Playgroud)

  • 我建议将Shape类移动到它自己的头文件中(因为实际上,它可能只是一个接口),并将Shapes.h重命名为Rectangle.h.然后你可以从这两个文件包括shape.h没有问题. (2认同)