[英]Forward-declaring a custom type of another namespace in a header file
我正在使用一个名为custom (不是实际名称)的外部库,该库在其自己的名称空间中定义了许多数据类型。 假设命名空间也被命名为custom
。
我正在尝试使用一个名为DataType
的数据DataType
。 DataType
是使用typedef定义的自定义类型,我们通过包含"custom/datatype.h"
来假定它可以在.cpp文件中使用。
我的代码具有以下设置。
action.h:
class Action
{
Action() {}
virtual ~Action() {}
virtual void foo(custom::DataType*) const = 0;
...
}
some_action.h:
#include "action.h"
class SomeAction : public Action
{
SomeAction() {}
virtual void foo(custom::DataType*) const override;
...
}
some_action.cpp:
#include "some_action.h"
#include "custom/datatype.h"
...
void SomeAction::foo(custom::DataType*) const
{
...
}
是否有前瞻性声明的任何适当的方式DataType
在action.h
和some_action.h
比包括其他"custom/datatype.h"
在action.h
?
有没有定义任何适当的方式
DataType
在action.h
和some_action.h
比包括其他"custom/datatype.h"
在action.h
?
您可能不希望“定义” DataType
,而是“向前声明”它。 这使您可以使编译器知道custom::DataType
,稍后将对其进行定义。
您可以按照以下步骤实现。 在action.h
和some_action.h
添加以下向前声明 :
namespace custom { class DataType; }
在需要定义DataType
的.cpp
文件中,包括"custom/datatype.h"
。
如果custom::DataType
是类型别名 (即typedef
) ,则需要包括标题。 没有一种向前声明类型别名的方法:有关相关信息,请参阅此问题和解答 。
如果DataType
是类类型或具有基础整数类型的枚举,则可以在action.h
对其进行转发声明:
namespace custom {
class DataType1;
enum DataType2 : int;
}
缺点是更新库时可能会中断。 编写良好的库中的标头可能只包含前向声明,您可以使用它,因此您可以查找这些标头(例如iosfwd
)。
否则,将无法获得包含库编写者给您的标头的信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.