gpt4 book ai didi

c++ - "class ClassName;"放在其他类定义的头文件中是什么意思?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:44 25 4
gpt4 key购买 nike

我对这行代码 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

最佳答案

这是一个forward declaration , 启用指向 TreeItem 的指针很有用-s 在一些内部结构等中

当您有共同递归定义时,特别需要前向声明;例如一个struct foo包含指向 struct bar 的指针其中包含指向 struct foo 的指针等...您甚至可以声明这些 struct -s 并定义在不同翻译单元中操作它们的函数。

在 C 和 C++ 中,转发声明一些 struct 是常见的做法(或 class )并拥有指向它的指针的变量,并声明(并可能调用)处理此类指针的函数。

当然,一些其他文件(或翻译单元)会声明这种不透明的数据结构并对其执行操作。

这是实现abstract data types的常用方法.

顺便说一句,在标准 C 中通常有一个非常常见的示例。 FILE<stdio.h> 输入经常有些不透明(或者至少,被许多头文件隐藏得很好)struct (而且你显然不需要知道它的内部结构来使用 <stdio.h> 函数,比如 fprintf )

在您的(Qt)案例中,您不想#include <QTreeItem> - 或声明 class TreeItem 的任何头文件- 在这个QTreeModel头文件。如果这样做,将会添加额外的 header 依赖项(当 TreeModel 实现已更改时,您不需要重新编译 TreeItem 代码!)并且会减慢编译速度。

在较小的软件项目中,您可能只有一个头文件并定义所有 struct里面。

关于c++ - "class ClassName;"放在其他类定义的头文件中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31243964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com