forward声明-C++中不同文件中的循环引用

forward declaration - Circular references in C++ in different files

本文关键字:循环 引用 文件 声明 -C++ forward      更新时间:2023-10-16

如果我想要一个循环引用,但在C++的两个不同文件中,我该如何实现?

例如

AUnit.h

#inclue <BUnit.h>
class AClass : public TObject
{
   __published
        BClass * B;
};

BUnit.h

#include <AUnit.h>
class BClass : public TObject
{
    __published
        AClass *A;     
};

我不能只在一个带有正向声明的文件中实现它。

在这种情况下也可以使用正向声明:

// AUnit.h
class BClass;
class AClass : public TObject
{
   __published
        BClass * B;
};

// BUnit.h
#include <AUnit.h>
class BClass : public TObject
{
    __published
        AClass *A;     
};

如果它们都在一个文件中,则与场景没有区别,因为#include只插入包含的文件(实际上是突出文本替换)。这是完全一样的。在对BUnit.h进行预处理后,上面的内容如下:

class BClass;
class AClass : public TObject
{
   __published
        BClass * B;
};
class BClass : public TObject
{
    __published
        AClass *A;     
};

我假设您谈论的是循环依赖

答案确实是使用正向声明,例如:

AUnit.h

#include <BUnit.h>
class AClass : public TObject
{
   BClass *B;
};

BUnit.h

class AClass;  // Forward declaration
class BClass : public TObject
{
   AClass *A;
};

如果需要的话,您甚至可以在这两个头文件中都有一个正向声明。