放在其他类定义的头文件中时"class ClassName;"是什么意思?
What does "class ClassName;" mean when put in header file of other class definition?
我对这行代码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
这是一个正向声明,在一些内部结构等中启用指向TreeItem
-s的指针非常有用。
当您有共同递归定义时,特别需要正向声明;例如,包含指向struct bar
的指针的struct foo
,其中包含指向struct foo
的指针,等等。您甚至可以声明这些struct
,并在不同的翻译单元中定义对其进行操作的函数
在C和C++中,通常的做法是前向声明一些struct
(或class
(,并将变量作为指向它的指针,并声明(并可能调用(处理这些指针的函数。
当然,其他一些文件(或翻译单元(会声明这种不透明的数据结构,并对其执行操作
这是实现抽象数据类型的常用方法。
顺便说一句,在标准C中通常有一个非常常见的例子。<stdio.h>
中的FILE
类型通常是一些不透明的(或者至少被许多头文件隐藏得很好(struct
(而且使用fprintf
等<stdio.h>
函数显然不需要知道它的内部(
在您(Qt(的情况下,您不希望在此QTreeModel
头文件中使用#include <QTreeItem>
或声明class TreeItem
的任何头文件。如果这样做,将添加额外的头依赖项(当TreeItem
实现发生更改时,不需要重新编译TreeModel
代码!(,并且会减慢编译速度。
在较小的软件项目中,您可能只需要有一个单独的头文件,并在其中定义所有的struct
。
它被称为正向声明。维基百科上这样说:
在C++中,如果只需要使用指向该类类型的指针(因为所有对象指针都相同大小,而这正是编译器所关心的(。尤其是在类定义内部有用,例如,如果类包含成员它是指向另一个类的指针;避免循环引用(即。该类可能还包含一个成员,该成员是指向类(,我们只是转发声明这些类。
如果需要使用实际的类类型,例如,如果您有一个成员的类型为直接使用该类(而不是指针(,或者如果需要将其用作基类,或者如果需要在方法
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- "Undefined class"作为is_base_of的论据
- 如何修复此错误:className::className的无效使用
- 如何将class.cpp和class.hpp编译为一个.o文件
- 枚举类'classname'的多重定义
- '{'标记之前的预期类名,然后在预声明时无效使用不完整的类型'class class_name'
- 如何使用"derived input class"创建派生类?
- 错误:"Left of getValue must have class/struct/union"
- ' class a : b ' 和 ' class a : public b ' 之间的继承类不同
- Pybind11 Class Definition
- 在C++中使用没有合作伙伴Class/Cpp文件的头文件是否实用
- C2011 'CMemDC':Visual Studio 2019中的'class'类型重新定义
- TypeError: [c++ addon class] 不是构造函数
- C++ class template
- "class className;"本身在C++中有什么作用?
- C++ use of class Classname;
- C++ : class classname :: reference { ... }
- 放在其他类定义的头文件中时"class ClassName;"是什么意思?