0

我正在开发一个不是我自己的代码库,它具有以下布局:

对象.h:

// Objects are defined
// #include "tickets.h" (functions to access the objects)
// An access-handler object is defined

我想介绍一个知道对象的类,可以从tickets.h中的函数访问,但也可以使用access-handler对象。这些函数是独立的,即在tickets.h 中调用的类函数不使用访问处理程序(如果不是这种情况,我不知道从哪里开始)。

因此我的类需要在tickets.h之前定义,但是它的一些函数需要在access-handler之后定义。有没有办法做到这一点,而无需将其拆分为两个头文件,如下所示:

// 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 之后声明的对象?即访问处理程序对象。

EDIT2:像这样的东西:

对象.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之后才能定义。那么我应该在哪里包含它?

4

2 回答 2

2

如果我正确理解您的问题 - 您可以使用前向声明来解决此问题。这将允许您在定义它的方法之前声明一些类。例如:

// 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_;
};
于 2013-07-27T16:17:37.520 回答
1

我不太确定我是否理解正确并且在这里没有足够的声誉来发表评论,所以让我尝试以这种方式回答您的问题,如果我猜错了,请随时跟进:

我相信您所指的是一个完整的类定义,即一个包括类声明中的所有函数定义的定义。除此之外,看到对象定义后跟预处理器指令的情况并不常见。典型的是函数的前向声明和类原型。

因此,例如,您可以在 some 中声明header.h

class C 
{
public:
    void method1(void);
    int method2(void);
};

在某些implementation.cpp功能的定义中,例如:

void C::method1(void) { /*...*/ }

然后在访问处理程序的包含链中的另一个文件中定义另一个函数:

int C::method2(void) { /*...*/ }

顺便说一句,访问处理程序是什么意思?

哦,如果您在头文件中进行函数定义,您的链接器可能会对您大喊大叫。


关于您的附录:在您提出前向声明的任何地方,松散地说,编译器都会插入相关声明的副本,将其视为文件系统上下文中的软链接。如果您有许多函数签名或类的前向声明,则会产生与之相关的负面影响,例如增加持续时间和编译的内存负载。无法判断这是否会在您的特定情况下使用,因为只有您知道有问题的实际代码。但很可能它会起作用。

看看这些页面:

  1. http://en.wikipedia.org/wiki/Forward_declaration
  2. 我什么时候可以使用前向声明?
于 2013-07-27T16:20:05.103 回答