在我的应用程序中,我有两个名为widget
和form
的小部件。但是,如果我尝试在窗口小部件widget
头文件中创建窗口小部件form
的指针对象,则会给出类似“窗体不命名类型”的错误。请参考下面使用的代码:
main.cpp
#include <QtGui/QApplication>
#include "widget.h"
#include "form.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget *w = new Widget();
w->show();
return a.exec();
}
widget.cpp
#include "widget.h"
Widget::Widget(QWidget *parent) :QWidget(parent)
{
setupUi(this);
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include "ui_widget.h"
#include "form.h"
class Widget : public QWidget, private Ui::Widget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
Form *f ;//i try to create pointer object for Form
};
#endif // WIDGET_H
form.cpp
#include "form.h"
#include "widget.h"
Form::Form(QWidget *parent) :QWidget(parent)
{
setupUi(this);
}
form.h
#ifndef FORM_H
#define FORM_H
#include "ui_form.h"
#include "widget.h"
class Form : public QWidget, private Ui::Form
{
Q_OBJECT
public:
explicit Form(QWidget *parent = 0);
};
我做错了什么?
答案 0 :(得分:1)
您应该在widget.h中而不是Form
form.h中放置类#include
的前向声明。问题是你包括form.h,其中包括widget.h,尝试包含form.h,但由于include guard而不能。因此,在widget.h中,类Form
是未定义的,尽管它看起来要定义用户。
答案 1 :(得分:1)
问题在于widget.h
包含form.h
,其中包含widget.h
。标题保护(#ifndef
)导致跳过第二个包含。
为了在标题中声明一个指针变量,前向声明就足够了:
<强> SomeClass.h 强>
class Form; // forward declaration
class SomeClass {
public:
SomeClass();
// ...
private:
Form* form; // pointer to Form
};
<强> SomeClass.cpp 强>
SomeClass::SomeClass()
{
form = new Form();
}