向前删除标题文件中其他名称空间的自定义类型

Forward-declaring a custom type of another namespace in a header file

本文关键字:空间 自定义 类型 其他 删除 标题 文件      更新时间:2023-10-16

我正在使用一个名为 custom (不是实际名称(的外部库,该库在其自己的名称空间中定义了许多数据类型。假设名称空间也被称为custom

我正在尝试使用名为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
{
    ...
}

除了在action.h中包括"custom/datatype.h"以外,在action.hsome_action.h中有什么适当的方法可以转发Declare DataType

除了在action.h中包括"custom/datatype.h"以外,是否有适当的方法来定义DataTypesome_action.h

您可能不想"定义" DataType,而是"向前声明" 它。这使您可以使编译器意识到custom::DataType,该CC_16将在以后定义。

您可以如下实现这一目标。在action.hsome_action.h中,添加以下正向声明

namespace custom { class DataType; }

.cpp文件中需要DataType的定义,包括"custom/datatype.h"


custom::DataType是A type别名(即typedef(,您需要包括标头。没有一种转发类型的别名的方法:请参阅此问题&相关信息的答案。

如果DataType是具有基础整数类型的类类型或枚举,则可以在action.h中转发它:

namespace custom {
  class DataType1;
  enum DataType2 : int; 
}

不利的一面是,当您更新库时,它可能会破裂。书写良好的库可能包含一个包含的标题,除了您可能会使用的远期声明,因此您可以查找这些标题(示例:iosfwd(。

否则,没有包含您由图书馆作者给出的标头的追索权。