前向声明(Forward Declaration)

程序设计中,前向声明Forward Declaration)是指声明标识符(表示编程的实体,如数据类型、变量、函数)时还没有给出完整的定义。

前向声明 - 维基百科,自由的百科全书 (wikipedia.org)

向前声明 A , 即 原型(Prototype)。

class A; 

必须在某处提供这个被声明的函数的定义(其他文件)。

C++ 的 两个结构体之间相互引用自引用 会经常遇到 此问题。

自引用

class BinaryTree {
    int data;   // Data area
    BinaryTree left;
    BinaryTree right;
};

image-20210712135632118

此时会提示, field has incomplete type 'BinaryTree'

因为此时 BinaryTree 在被完整定义 (即 }) 之前被引用了。

  • 原因也很简单, 在编译 BinaryTree 的时候, 编译器在 {...} 里面发现了 BinaryTree
  • 所以编译器继续看 BinaryTree 的完整定义是什么….
  • 显然这样会造成死循环

自引用解决方法

class Test {
  static Test self;
};
class BinaryTree {
    int data;   // Data area
    BinaryTree* left;
    BinaryTree* right;
};

相互引用 / 前向引用

class A{
public:
  B val; 
};

class B{
public:
  A val; 
}
  • 同样会造成死循环A 需要 B , 但是 B 又需要 A

相互引用 / 前向引用 解决方法

  • 引用
  • 指针
  • static object
class B;  // 向前声明
class A{
public:
  B val; 
};


class B{
public:
  A val; 
}