Qt正向声明生成错误
Qt forward declaration generates error
编写类TemplateHandler时,假设我使用TemplateHandler.h(用于标头)和TemplateHandler.cpp(用于声明)。像
// Templatehandler.h
#ifndef TEMPLATEHANDLER_H
#define TEMPLATEHANDLER_H
#include <QObject> // Forward declaration of QObject generates error
class QListView; // Forward declarations
class QTextEdit;
class QModelIndex;
class QStringListModel;
class TemplateHandler : public QObject
{
Q_OBJECT
public:
TemplateHandler(QListView *view, QTextEdit *textEdit, QObject *parent);
virtual ~TemplateHandler();
private:
QTextEdit *mTextEdit;
QStringListModel *mModel;
};
#endif
和源
#include "templatehandler.h"
#include <QListView> // Inclusion of lib
#include <QTextEdit>
#include <QObject>
#include <QStringListModel>
TemplateHandler::TemplateHandler(QListView *view, QTextEdit *textEdit, QObject *parent) : QObject(parent), mTextEdit(textEdit)
{
mModel = new QStringListModel(this);
QStringList templates;
templates << "<html>" << "</html>" << "<body>" << "</body>";
mModel->setStringList(templates);
view->setModel(mModel);
connect(view, SIGNAL(clicked(const QModelIndex&)), SLOT(insertText(const QModelIndex&)));
}
TemplateHandler::~TemplateHandler() {
// TODO Auto-generated destructor stub
}
但是在这种情况下,QObject的前向声明会生成错误,但是其余的都是可以的。我需要一些帮助。
这是一个纯粹的c++"问题"。
只有当编译器在包含标头时不需要类的大小时,正向声明才起作用。例如,对于指针,甚至对于类,它都知道大小。
另一方面,对于在堆栈上创建的对象或父类,它需要知道结构的确切大小(例如sizeof(QObject)
),而只有通过包含.h
才能获得。
您是从QObject
继承的,向基类转发声明是不起作用的。这是因为当从继承类时,编译器需要知道类的大小,正如Koying所提到的,这需要包括.h
文件。
在所有其他情况下,都使用指向前向声明类的指针。指针只不过是内存地址,不需要知道类的整个大小,因为指向它的指针的大小只是存储内存地址所需的大小(取决于体系结构、平台等)。如果你尝试创建像QListView listView
而不是QListView* listView
这样的成员,那么你仍然会面临类似的问题。
相关文章:
- 错误:未在此范围内声明'reverse'
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 错误:"imread"未在此范围内声明
- 在气泡排序程序中未声明错误功能
- 使用全局声明的向量时,C++双重释放错误/损坏
- 使用直接大括号初始化时,C++ 编译错误"声明末尾的预期";"
- C++ [错误] 声明'char '隐藏参数。什么意思?
- 类中的静态函数给出了错误:声明中的两种或多个数据类型
- 错误:声明冲突 - 指针不能是 int
- 收到 CUDA 错误"声明与以前的"variable_name"不兼容
- 错误:声明不声明
- Visual Studio 2010 链接器错误C++声明我从头文件创建的类时
- Cython 错误:声明不声明任何内容
- 错误"声明非模板函数"C++
- 无效地使用不完整的类型/前向错误声明.可能误用抽象类?(c++)
- 错误:声明冲突.用c++编译c代码
- C++错误:声明中存在显式限定
- else语句(C++)上的错误w/声明
- 初始化const类成员,错误:声明没有声明任何内容