C++前向声明隐含的问题

今天写代码的时候,遇到了一个很神奇的问题,在代码编译的时候很正常,编译成功。

但是运行的时候,问题就出来了。

B *b;

我在代码中A *a = b->constructA();

(constructA()在内部调用new,创建一个新的A的实例)

即由类B的对象b生成一个类A的对象a,这里没有问题,

 

我在这里什么都不做,直接调用delete a;

神奇的时刻到来了,程序直接崩溃。

 

经过几个小时的分析是因为include和前向声明的问题。

 

A.h:

class A{

...

}

 

B.h:

class A;//这里前向声明A,

class B{

    A * constrctA(){

          ...

    }

}

 

main.cpp:

#include "B.h"

int main(){

    B *b = new B;

    A *a = b->constructA();

    delete a;

    return 0;

}

 

在编译的时候,很成功,因为在B.h中,编译器找得到A这个类声明或者是定义的语句:class A;

因此在编译的时候,没有#include “A.h”也能够正常编译!!!问题就出在这儿了。

 

在运行的时候,A *a = b->constructA();没问题

然后这儿的A并没有实现,他并没有任何函数,

当我调用delete a;的时候,会自动调用析构函数,这样根本就找不到析构函数,

所以,程序在运行delete a;的时候会crash。

解决的办法就是添加#include "A.h"

 

 

如果有什么不对的地方,请您及时指出来。大家互相学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值