繁体   English   中英

在头文件中前向声明另一个命名空间的自定义类型

[英]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
{
    ...
}

是否有前瞻性声明的任何适当的方式DataTypeaction.hsome_action.h比包括其他"custom/datatype.h"action.h

有没有定义任何适当的方式DataTypeaction.hsome_action.h比包括其他"custom/datatype.h"action.h

您可能不希望“定义” DataType ,而是“向前声明”它。 这使您可以使编译器知道custom::DataType ,稍后将对其进行定义。

您可以按照以下步骤实现。 action.hsome_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM