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

时间:2017-04-27 09:18:59

标签: c++

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

DataType中的action.h以外,是否有正确的方式在some_action.h"custom/datatype.h"中转发action.h

2 个答案:

答案 0 :(得分:2)

  

action.h中的some_action.h以外,是否有正确方法在"custom/datatype.h"action.h中定义DataType

您可能不想"定义" custom::DataType,而是"forward declare"。这允许您使编译器知道稍后将定义的action.h

您可以按如下方式实现此目的。在some_action.hnamespace custom { class DataType; } 中添加以下转发声明

.cpp

DataType文件中,您需要"custom/datatype.h"的定义,请添加custom::DataType

如果typedef类型别名 (即public class AuditResults { public string ID { get; set; } public string Question { get; set; } } public class AuditResults2 { public int Channel_ID { get; set; } public bool Available_Item{ get; set; } } ,则需要包含标头。没有一种前向声明类型别名的方法:有关相关信息,请参阅this question & answers

答案 1 :(得分:1)

如果<link href="/css/bootstrap.min.css" rel="stylesheet"> <script src="/js/jquery.js"></script> <script src="/js/bootstrap.min.js"></script> 是类类型或具有基础整数类型的枚举,那么您可以在DataType中转发声明它:

action.h

缺点是更新库时可能会中断。编写良好的库可能有一个标题,除了前向声明之外,你可以使用它,所以你可以查找它们(例如:namespace custom { class DataType1; enum DataType2 : int; } )。

否则,包括图书馆作者给出的标题无法追索。