我对这行代码感到有点困惑class TreeItem;
.class TreeItem;
在此文件中未包含的其他文件中定义.我必须在一本书中查看这个问题,但我确信这个问题的答案很简单.
#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
Run Code Online (Sandbox Code Playgroud)
它是一个前向声明,它可以TreeItem
在某些内部结构中指向-s.
当你有共同递归的定义时,显然需要前向声明; 例如,struct foo
包含指向struct bar
其中包含指针的指针struct foo
等等...您甚至可以声明这些struct
-s并在不同的翻译单元中定义对它们进行操作的函数.
在C和C++中,通常的做法是转发声明一些struct
(或class
)并拥有指向它的变量,并声明(并且可能调用)处理这些指针的函数.
当然,其他一些文件(或翻译单元)会声明这种不透明的数据结构并在其上实现操作.
这是实现抽象数据类型的常用方法.
顺便说一句,在标准C中通常有一个非常常见的例子.FILE
来自的类型<stdio.h>
通常是一些不透明的(或者至少被许多头文件很好地隐藏)struct
(你显然不需要知道它的内部结构)使用<stdio.h>
功能像fprintf
)
在你的(Qt)的情况下,你不想#include <QTreeItem>
- 或者class TreeItem
在这个QTreeModel
头文件中声明的头文件.如果你这样做,那将增加一个额外的头依赖项(你不需要TreeModel
在TreeItem
实现发生变化时重新编译代码!)并且会减慢编译速度.
在较小的软件项目中,您可能只需要一个头文件并定义所有struct
内部文件.
归档时间: |
|
查看次数: |
2703 次 |
最近记录: |