包括在头或cpp -什么是首选的Qt
Include in header or cpp - what is preferred in Qt
当我写一个c++类时,我只在特定的情况下在header中写include。我更喜欢前向声明,我相信这是c++的最佳实践。但是Qt类经常有很多字段是标准的Qt类,把它们都写在前向声明中似乎不是一个好主意。有什么更好的方法吗?Qt有庞大的文档,所以我认为它已经回答了我的问题,但我刚刚开始阅读它。
我的规则是头文件只包含那些定义了有问题的头文件使用的功能的文件。
假设您在头文件中有指向某些类Foo
的指针和引用,但头文件从未插入或实例化这些对象。在这种情况下,您不需要类的定义。你所需要的只是一个前向声明。
另一方面,如果插入类型为Foo
的对象,或者具有类型为Foo
的数据成员或变量,则前向声明是不够的。现在您确实需要完整的定义,所以现在是时候#include
定义类Foo
的头文件了。(或者,如果使用在内联函数定义中,您可能需要重新考虑内联并将实现放在单独的源文件中。)
头文件只是说"我们能做什么"。cpp
文件说"我们可以这样做,这就是我们的意图"。
Qt,出于这个目的,只是一个c++库。您当然可以继续编写forward声明。如果您的类变得臃肿,这可能表明您在一个类中混合了UI(表示)和数据/逻辑代码。更清晰的职责分离可能使您能够用大量更简单的类替换一些复杂的类。
这是JvO -你说
这总是一种权衡;前向声明迫使您:A)在其他头文件中只使用指向你转发的类的指针;B)在每一个使用该类的.cc/.cpp文件中包含头文件
class Ditto;
Ditto letsHaveANewOne();
void useIt(Ditto X);
那么指针在哪里?
Forward声明避免了依赖关系的需要。这很好,因为它使编译器可以将一些麻烦转移给链接器。还要考虑许多具有头文件的代码,并且必须为类声明打开文件,解析它们等。从长远来看,你节省了时间。
前向声明在IMO中只有在以下情况下才有用C)你的代码处于不断变化的状态,你想避免大量的重新编译;D)你的类声明太大
见上文-它也被称为解耦。试试吧——从长远来看会节省时间的。
这总是一种权衡;前向声明强制您:
A)在其他头文件中只使用指向你转发的类的指针;
B)在每一个使用该类的.cc/.cpp文件中包含头文件。
两者有时都有点麻烦;特别是a)你不能使用或返回对你转发的声明类的引用,b)在你的c++文件中键入并生成一长串#include是很烦人的。
前向声明只有在
C)你的代码处于不稳定状态,你想避免大量的重新编译;
D)你的类声明太大
点c)不适用于Qt(假设您不每天更新库)。D)确实适用,但如果你的编译器支持,可以通过使用预编译头文件来缓解。
Qt(至少4.7)没有捆绑的向前声明,除了QtContainerFwd中的容器(list, set, map等)。如果您发现自己一遍又一遍地输入相同的前向声明列表,您可能需要考虑使用这些声明创建自己的头文件。
- Qt:remove() 和 rmdir() 有什么区别
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 在QT中为小部件添加彩色边框的最佳方法是什么
- 当再次触发信号时,从Qt插槽执行的功能被第二次调用时会发生什么?
- 如果目标对象死亡,Qt::BlockingQueuedConnection发射会发生什么
- 在Qt Creator中应用代码更改的快捷方式是什么?
- 尝试使用 Qt 库中的 QPixmap 将图像拆分为多个块。关于他的复制方法的工作方式,我有什么不明白的吗?
- 使用 Qt -static,QWindowsGuiEventDispatcher 和 QWindowsUiaWrapper 需要什么库?
- 在Qt中使用工作线程将数据写入文件的正确方法是什么?
- tr( "302261" ) 在 Qt 中是什么意思?
- 在QT资源系统中,前缀比文件系统路径的优势是什么?
- 当我们关闭QT中的窗口时,发出的信号是什么
- QT:私人会员而不是继承?原因是什么?这是一个具体的概念吗?
- Qt添加到QGraphicsLinearLayout时QGraphicsItems会发生什么
- 从应用程序调用静态库时,QT创建者什么都不会发生
- 当QT与无角和-NO-OPENGL编译时会发生什么
- 执行随机开关函数的QT方式是什么连续两次使用相同情况的方法
- Qt:交换QGraphicsRectItem位置的最佳方法是什么
- 一般来说,使用Qt Creator,是什么导致程序在调试模式下编译时正确运行,但在发布模式下崩溃
- qt c++ 中的这句话是做什么的