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

如何在C++中使用类原型,c++,class,prototype,C++,Class,Prototype,我试图在定义类之前创建类对象。这是一个例子 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 dec

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

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以获得其完整声明

此外,在这一点上:

void fun(B obj) {
}
编译器需要知道B是什么。也就是说,它有多大,它的成员有什么类型,定义了什么构造函数,等等。否则,它无法生成您要求它生成的代码

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

定义不在A之前声明B,或 只声明A::fun inline,并在定义了B之后移动定义 通过指针或引用传递B obj-因为指针和引用的大小都相同,并且都没有调用尚未声明的构造函数,所以这是可行的,但是。。。在定义B之前,您仍然无法在fun中对B实例执行任何操作

因此,当前代码将被编译,但如果fun做的不仅仅是指针算术,它将再次崩溃


在这个函数定义中

void fun(B obj){
}
你告诉编译器你将把堆栈上的一个B实例传递给fun。因此,编译器需要知道B的定义,以便知道要分配多少堆栈空间。在代码的这一点上,您只声明B存在。您没有为它提供B的定义,因此它无法知道需要多少内存


[编辑以修复声明/定义错误陈述]

B类是否依赖于A类?如果不是,那么为什么不在A之前定义B呢?既然B不依赖于A,但A依赖于B,那么在A之后声明它就没有什么意义了,但这只是我的一个风格观点。如果是我,我会将B的定义移到A之前。替代方法:通过引用传递参数obj。如果没有像示例中那样使用它,那么编译器就不需要完整类型,它知道引用的大小是指针的大小。@ChrisBeck-只要您在a::fun中使用obj并按照原始定义顺序,这仍然会中断。@stix@ChrisBeck这显然是一个最小的示例。有许多情况需要特定的声明顺序,函数也将使用B。顺便说一句,谢谢你,OP,简单明了的例子:叹气-这是对Chris的通过引用建议的回答。我应该再次开始使用@tags,即使它们在注释中不起作用。函数声明不需要参数的定义。请在堆栈中使用no。我和其他人一样对此感到内疚,但这仍然无济于事。此外,B的大小是编译器的最小问题,因为它不知道它的复制构造函数、析构函数等等。对于这家伙的理解水平,“在堆栈上”就足够了,其他任何东西都将是模糊的,而不是清晰的。