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

标签 c++ qt

我正在处理的 Qt 应用程序中收到没有类型错误的禁止声明。问题是我已经包含了声明该类的头文件。据我所知,它应该被定义为一种类型。我也尝试过前向声明,但我想在这个文件中使用类的方法,所以我需要整个头文件。 代码:

形状.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 中。 如果我使用前向声明即。类 GLWidget;这个错误消失了,但是我实际上不能像在 Rectangle.draw() 中那样使用 GLWidget 方法

有人知道为什么编译器不会将 GLWidget 视为 Shapes.h 中的类型吗?

确切错误:

Shapes.h:20: 错误:'*' 标记前应为 ')'
Shapes.h:31: 错误:ISO C++ 禁止声明没有类型的“GLWidget”
Shapes.h:31: 错误:应为 ';'在“*”标记之前
Shapes.h: 在成员函数 'virtual void Rectangle::draw()':
Shapes.h:25: error: 'glWidget' undeclared (第一次使用这个函数)
Shapes.h:25: 错误:(每个未声明的标识符在它出现的每个函数中只报告一次。)

最佳答案

头文件之间存在循环依赖关系——Shapes.h 包含 glwidget.h,后者又包含 Shapes.h。因此,编译器第二次尝试包含 glwidget.h 时,include guard AGLWIDGET_H has 已被定义,因此它不会再次包含它,然后代码在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

关于c++ - Qt ISO C++ 禁止没有类型的声明 - 是否包含头文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3817208/

相关文章:

c++ - 除非明确专门化,否则模板类的静态成员不会实例化?

C++ cmath pow 错误存在于旧版本的编译器中,但不存在于新版本中

c++ - std::chrono 不同的结果 - 固定时间步长循环

当头文件存在时,Qt/MinGW 为头文件提供 "no such file or directory"

c++ - Qt:保存 Qt-creator 应用程序的 SQLite 数据库的最佳 "Path"在哪里?

c++ - 这种关系是聚合、组合还是其他?

c++ - 延期成员(member) build

python - PyQt5 : how to make QThread return data to main thread

html - 显示图像的文本浏览器显示 "QFSEngine::open: No file specified "警告

c++ - 从聚合线程更新 QListView 使 GUI 卡住