在工厂或C++类中包含数据库 .h 文件



我有一个工厂GuiTable.cpp在那里我创建了多个与GUI相关的类。我还有一个数据库类,CommonStrDatabase.h它用作 GUI 中使用的不同字符串的数据库文件。 我在工厂中创建的一个类如下所示:

#include "display/DisplayMenu.h"
#include "CommonStrDatabase.h"
namespace gui{
namespace display{
DisplayMenu::DisplayMenu(MenuID Id, MyProcess* OwnerProc)
: Menu(Id, STRING_DIAGMENU, OwnerProc)
{
Layout layout( paramText,
paramTop,
paramWidth,
setParamtHeight );
int row = 0;
layout.addGraphicalControl(row++, 0, new StrView(DEV, OwnerProc, "Close menu" , 0, 0, TEXTALIGN_L, TextFont));
...
}

参数STRING_DIAGMENU是一个字符串(实际上是一个 typedef,但在这里无关紧要(,它来自CommonStrDatabase.h。我的问题:像我在这里所做的那样包含数据库文件更好,还是将其包含在工厂中,然后将字符串作为参数传递给DisplayMenu,如下所示:

#include "display/DisplayMenu.h"
#include <string>
namespace gui{
namespace display{
DisplayMenu::DisplayMenu(MenuID Id, MyProcess* OwnerProc, string DiagMenuString)
: Menu(Id, DiagMenuString, OwnerProc)
{
Layout layout( paramText,
paramTop,
paramWidth,
setParamtHeight );
int row = 0;
layout.addGraphicalControl(row++, 0, new StrView(DEV, OwnerProc, "Close menu" , 0, 0, TEXTALIGN_L, TextFont));
...
}

我想最好将数据库文件包含在工厂中的一个地方,否则您必须将其包含在使用它的每个类中?即使您在CommonStrDatabase.h中使用#pragma once,多个包含也会使编译时间变慢吗?

关于管理依赖项和标头,有几个建议需要遵循。

首先,你的工厂标题应该是自给自足的:如果有人只想要工厂,他或她应该能够依靠你的标题的完整性。 因此,如果您的工厂需要其他标头,请在工厂标头中包含 。这是上面超链接的准则 9。这也是一个核心的 c++ 准则。

正确的依赖关系管理要求您提前考虑更改数据库会发生什么:如果在某些也使用工厂的 cpp 中,仅仅因为工厂标头而依赖于 database.h hot,但因为它主动使用数据库的元素,独立于工厂,那么显式包含 database.h。这是超链接文档的准则 1 和 13。这也是一个核心准则。

最后,您需要在标头中包含守卫。当然#pragma once很好。但它不是便携式的。因此,c++ 核心准则建议不要使用它。

最新更新