错误信息:
未知重写说明符
![](https://i-blog.csdnimg.cn/blog_migrate/94ccd9e644797bcd693ce48b99742332.png)
产生原因:
头文件相互包含并且互相声明了对方类的对象。即
“1.h" 包含了
“2.h" 里面含class A{ }; 类A里面含有B b;
“2.h" 包含了
“1.h"
里面含class B{ }; 类B里面含有A a;
从实现的角度上看由于1.h 2.h处于不同文件 其编译顺序肯定有先有后,假如先编译了含
“1.h" 的cpp文件,那么
“1.h" 中的B b对于编译器来说是未知的,这样就产生了一个
超前编译的错误。
第二个错误类A中包含了类B,类B中又包含了类A,
这是一个无限的包含过程!
为了避免这个情况应把二者都声明未指针,而且为了避免头文件相互包含中的"重复包含"我们需要在俩个头文件中加入避免重复包含的宏定义!例如#ifndef SHOWWAVE_H
#define SHOWWAVE_H 文件体 #endif 俩个头文件里都需要加入!这样就能保证俩个头文件都只能包含一次,或者可以加入新的宏命令 #pragma once 文件体实现原理是相似的。
#define SHOWWAVE_H 文件体 #endif 俩个头文件里都需要加入!这样就能保证俩个头文件都只能包含一次,或者可以加入新的宏命令 #pragma once 文件体实现原理是相似的。
解决方案:
头文件重包含产生的问题难以解决,建议尽量避免产生这种情况!但是在图形化界面的应用中,经常会产生一种情况-窗口之间的来回切换,这是A窗口需要包含B窗口的类 B窗口需要包含A窗口的类 这里可以采取两种解决方案:
一.写在同一个.h文件中。
把俩个类写在同一个.h文件中。并且需要声明后面的那个类
extern class A;
class B{ };
class A{ };
二.写在不同.h文件中。
现实实现中,我们避免不了把不同的类放到不同的.h文件中,这是良好的编程规范。为此我们无法使用声明的方法,此时可采用的方法是声明时使用基类指针 使用时调用子类的构造函数,因为基类指针在编译时往往可以避免超前编译这个问题。