如何在C ++中使用Class Prototype

时间:2015-08-17 15:01:12

标签: c++ class prototype

我正在尝试在定义类之前创建类Object。这是一个例子。

worker

以下是错误列表:

class A;
class B;

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

    return 0;
}

任何解决方案?我已经搜索过它,但未能解决这个问题.. 在此先感谢。

3 个答案:

答案 0 :(得分:3)

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

#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;

答案 1 :(得分:1)

此时:

void fun(B obj) {
}

编译器需要知道 B是什么。也就是说,它的大小,成员的类型,定义的构造函数等等。否则,它无法生成您要求的代码。

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

  1. B
  2. 之前定义(未声明A
  3. 声明 A::fun内联,并在定义B后移动定义
  4. 通过指针或引用传递B obj - 因为指针和引用都是相同的大小,并且既没有调用你尚未声明的构造函数,这也有效,但是......你仍然不能执行 Bfun个实例的任何内容,直到B被定义。

    因此,当前代码将编译,但如果fun除了指针算术之外还执行任何操作,它将再次中断。

答案 2 :(得分:0)

在此功能定义中,

void fun(B obj){
}

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

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