正在解析包含顺序
Resolving Inclusion Ordering
我正在开发一个不是我自己的代码库,它有以下布局:
object.h:
// Objects are defined
// #include "tickets.h" (functions to access the objects)
// An access-handler object is defined
我想介绍一个类,它知道对象,可以从tickets.h中的函数访问,但也可以使用访问处理程序对象。函数是独立的,即ticket.h中调用的类函数不使用访问处理程序(如果不是这样的话,我不知道从哪里开始)。
因此,我的类需要在tickets.h之前定义,但它的一些函数需要在访问处理程序之后定义。有没有一种方法可以做到这一点,而不将其拆分为两个头文件,如下所示:
// Objects are defined
// -- include declaration of class, and definition of functions that tickets.h needs
// #include "tickets.h"
// An access-handler object is defined
// -- include functions of class that need the access-handler
把这样的东西分成两个单独的文件似乎很混乱,我希望能把所有的东西都包含在内。
感谢您的帮助,我显然对c++中的声明/定义只有非常初步的了解。
编辑:如果我使用前向声明并将其包含在tickets.h之前(在mynewclass.h中声明的类和在mynewclass.cc中定义的函数)mynewclass.cc是否能够使用在包含mynewclass.h.之后声明的对象即访问处理程序对象。
第二版:类似的东西:
object.h:
class obj { // definition }
#include "tickets.h"
class obj_handler {
public void handle { // code }
}
票。h:
void do_something(obj o){
communicator.foo();
}
我的对象(通讯器):
class communicator {
public:
void foo() { // code }
void bar() { // use handle() from obj_handler }
}
正如您所看到的,我的通信器需要在tickets.h中使用,但在obj_handler之后才能定义。那么我应该把它包括在哪里呢?
如果我正确理解你的问题,你可以使用正向声明来解决这个问题。这将允许您在定义某个类的方法之前声明该类。例如:
// this is forward declaration of class A, no definition provided
class A;
class B
{
// uses A
A * a_;
};
// class A definition
class A
{
// may use class B now
B * b_;
};
我不太确定我是否理解这一点,而且我在这里还没有足够的声誉来对此发表评论,所以让我试着用这种方式回答你的问题,如果我猜错了,请随时跟进:
我相信您所指的是一个完整的类定义,即包含类声明中所有函数定义的定义。除此之外,对象定义后面跟着预处理器指令的情况并不常见。不过,典型的是函数的前向声明和类原型。
因此,例如,您可以在一些header.h
:中声明
class C
{
public:
void method1(void);
int method2(void);
};
并且在一些implementation.cpp
中定义了如下函数:
void C::method1(void) { /*...*/ }
在包含链中访问处理程序前面的另一个文件中,您可以定义另一个函数:
int C::method2(void) { /*...*/ }
顺便问一下,您所说的访问处理程序是什么意思?
哦,如果您在头文件中进行函数定义,那么您的链接器可能会对您大喊大叫。
关于你的附录:无论你在哪里提出一个正向声明,粗略地说,编译器都会插入一个有问题的声明副本,将其视为文件系统上下文中的软链接。如果您有许多函数签名或类的前向声明,那么它会带来负面影响,比如增加编译的持续时间和内存负载。不可能判断这是否适用于您的特定情况,因为只有您知道有问题的实际代码。但它很可能会奏效。
看看这些页面:
- http://en.wikipedia.org/wiki/Forward_declaration
- 我什么时候可以使用远期申报
- 具有包含其他对象的类的对象创建顺序
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 为什么更改包含 psapi.h 的顺序会产生编译错误?(标识符 BOOL 未定义)
- 按类成员的顺序对包含类对象的C++向量进行排序
- C++:当顺序真正重要时,如何保证在项目中包含头文件的顺序
- 正确的包含顺序是什么
- 更改AC_CHECK_HEADER中包含项的顺序
- 检查两个 Boost.MPL 序列是否按任何顺序包含相同的类型
- 使用包含每个重复数量的列表生成重复,上升整数的顺序,并用推力
- 指定 gcc 和 g++ 包含和库路径中的顺序
- 按字典顺序从范围中获取下一个数字(不包含所有字符串的容器)
- Qmake-如何配置包含路径顺序
- 当C++模板类中存在循环依赖关系时,修复包含顺序
- 编写一个函数,返回一个堆栈,该堆栈包含所有小于给定数字的元素,并且顺序相同
- 如何按顺序包含页眉
- 正在解析包含顺序
- 修改TestAssert.h (cppunit)——为什么包含的顺序对宏展开很重要
- c++应用程序中包含的头文件的顺序
- H和HPP问题,包含顺序错误
- 是否有任何标准的包含顺序来避免隐藏的依赖关系