C++ 什么是;类名&引用;当放入其他类定义的头文件时是什么意思?
我对这一行代码C++ 什么是;类名&引用;当放入其他类定义的头文件时是什么意思?,c++,qt,C++,Qt,我对这一行代码classtreeitem有点困惑类树项是在此文件中未包含的其他文件中定义的。 我必须在书中查找这个问题,但我相信这个问题的答案很简单 #ifndef TREEMODEL_H #define TREEMODEL_H #include <QAbstractItemModel> #include <QModelIndex> #include <QVariant> class TreeItem; //here, what does this do?
classtreeitem有点困惑代码><代码>类树项代码>是在此文件中未包含的其他文件中定义的。
我必须在书中查找这个问题,但我相信这个问题的答案很简单
#ifndef TREEMODEL_H
#define TREEMODEL_H
#include <QAbstractItemModel>
#include <QModelIndex>
#include <QVariant>
class TreeItem; //here, what does this do??
//! [0]
class TreeModel : public QAbstractItemModel
{
...
public:
...
private:
...
};
//! [2]
#endif // TREEMODEL_H
\ifndef TREEMODEL\H
#定义树模型
#包括
#包括
#包括
类树//这里,这是做什么的??
//! [0]
类TreeModel:公共QAbstractItemModel
{
...
公众:
...
私人:
...
};
//! [2]
#endif//TREEMODEL_H
它被称为。
维基百科说:
在C++中,如果只需要使用类,则可以声明类
指向该类类型的指针(因为所有对象指针都相同
大小,这是编译器关心的)。这尤其重要
类定义内部有用,例如,如果类包含成员
这是指向另一个类的指针;避免循环引用(即。
该类还可能包含一个成员,该成员是指向该类的指针
类),我们只需转发声明类即可
如果需要使用
实际的类类型,例如,如果您有一个类型为
直接使用该类(不是指针),或者如果需要将其用作
基类,或者如果需要在
方法
它是一个,在某些内部结构中启用指向TreeItem
-s的指针非常有用
当您有共同递归定义时,特别需要向前声明;e、 g.一个struct foo
包含指向struct bar
的指针,其中包含指向struct foo
的指针等。。。您甚至可以声明这些struct
-s,并在不同的翻译单元中定义在其上操作的函数
<> P> >在C和C++中,通常要声明一些<代码>结构> /COD>(或<代码>类< /代码>),并有指向指针的变量,并声明(和可能调用)函数来处理这些指针。
当然,其他一些文件(或翻译单元)会声明这种不透明的数据结构并对其执行操作
这是一种常见的实现方法
顺便说一句,在标准C中通常有一个非常常见的例子。来自
的文件类型通常是不透明的(或者至少被许多头文件很好地隐藏起来)结构(显然,使用
函数,如fprintf
,不需要知道它的内部结构)
在您(Qt)的情况下,您不希望在这个QTreeModel
头文件中包含-或声明类树项的任何头文件。如果您这样做了,那么将添加一个额外的头依赖项(当TreeItem
实现发生更改时,您不需要重新编译TreeModel
代码!),并且会降低编译速度
在较小的软件项目中,您可能只需要一个头文件,并在其中定义所有的结构。请看。您可能可以删除对QT的所有引用;是在其他文件中定义的,但不包括在此文件中。@JonathanPotter我通过为其上下文添加有效的推理扩展了答案,但我仍然不明白。如果我们有类TreeItem
在其他文件中定义,为什么我们要写这一行而不是写#include“TreeItem.h”
这个类所在的文件defined@Coaxial是创建指向所引用类的指针并避免额外依赖项的最低要求。如果我们有班级树;在其他文件中定义的,为什么我们要写这行而不是写#include“TreeItem.h”这个类定义的文件来避免包含一个非常大的头文件和添加无用的依赖项。Starynkevich很酷。所以这个标题无论如何都包括在内。避免包含它真的有意义吗?是的,使用不透明的struct
-s仍然非常有用:代码可读性更强,编译器负担更少。