如何在 C++ 中使用 Class 原型

How to use Class Prototype in C++

我试图在定义 class 之前创建 class 对象。这是例子。

class A;
class B;

class A{
    public: 
    void fun(B obj){
    }
};
class B{ };
int main(){

    return 0;
}

这是错误列表:

In member function 'void A::fun(B)':
6   13  [Error] 'obj' has incomplete type
2   7   [Error] forward declaration of 'class B'

有什么解决办法吗?我已经搜索过了,但没能解决这个问题.. 提前致谢。

B 完全声明后,提供 A::fun() 的外联定义:

#include <iostream>

class A;
class B;

class A {
    public: 
    void fun(B obj);
};

class B{ };

void A::fun(B obj) {}

int main() {
    return 0;
}

定义通常会放入 .cpp 文件中,您可以在其中包含 B.h 以获得完整的声明。

此外,please don't using namespace std;

此时:

void fun(B obj) {
}

编译器需要知道什么是 B。也就是说,它有多大,它的成员有什么类型,定义了什么构造函数等等。否则,它不能生成你要求它生成的代码。

您可以通过以下方式解决此问题:

  1. 定义(未声明B 之前 A,或
  2. declare A::fun内联,并且在B也已经定义
  3. 之后移动定义
  4. 通过指针或引用传递 B obj - 因为指针和引用都具有相同的大小,并且都不会调用您尚未声明的构造函数,这有效,但是......你在定义 B 之前,fun 中的 B 实例仍然无法 执行 任何操作。

    因此,当前代码可以编译,但如果 fun 做的不仅仅是指针运算,它会再次中断。

在这个函数定义中,

void fun(B obj){
}

您是在告诉编译器您要将堆栈上的 B 实例传递给 fun。因此,编译器需要知道 B 的定义,以便它知道要分配多少堆栈 space。此时在代码中,您只声明了 B 存在。你还没有给它提供 B 的定义,所以它不知道需要多少内存。

[编辑以修复 declaration/definition 错误陈述]