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

2019-06-23  本文已影响0人  成都老刘

前言

导入很久很久以前写的一篇技术!缅怀下以前写 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"

上一篇下一篇

猜你喜欢

热点阅读