我正在使用一个名为 custom 的外部库(不是实际名称),它在自己的命名空间中定义了许多数据类型。我们假设命名空间也被命名为custom
。
我正在尝试使用名为DataType
的数据类型。 DataType
是使用typedef定义的自定义类型,我们假设它可以通过包含"custom/datatype.h"
我的代码有以下设置。
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
?
答案 0 :(得分:2)
除
action.h
中的some_action.h
以外,是否有正确方法在"custom/datatype.h"
和action.h
中定义DataType
?
您可能不想"定义" custom::DataType
,而是"forward declare"。这允许您使编译器知道稍后将定义的action.h
。
您可以按如下方式实现此目的。在some_action.h
和namespace 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;
}
)。
否则,包括图书馆作者给出的标题无法追索。