引言:

  有种特殊情况,当两个类需要相互引用形成一个”环形“引用时,无法先定义使用。 这时候需要用到前向申明

但是前向申明的类不能实例化。

 1 #pragma once
 2
 3 #include "B.h"
 4 class A
 5 {
 6 public:
 7     A();
 8     ~A();
 9
10     B b_;
11 };

#pragma once
#include "A.h"
class B
{
public:B();~B();A a_;
};

两个类互相包含编译的提示错误为:

1 1>------ 已启动生成:  项目: test, 配置: Debug Win32 ------
2 1>  B.cpp
3 1>g:\cpp\代码\test\test\a.h(10): error C2146: 语法错误: 缺少“;”(在标识符“b_”的前面)
4 1>g:\cpp\代码\test\test\a.h(10): error C4430: 缺少类型说明符 - 假定为 int。注意:  C++ 不支持默认 int
5 1>  A.cpp
6 1>g:\cpp\代码\test\test\b.h(9): error C2146: 语法错误: 缺少“;”(在标识符“a_”的前面)
7 1>g:\cpp\代码\test\test\b.h(9): error C4430: 缺少类型说明符 - 假定为 int。注意:  C++ 不支持默认 int
8 1>  正在生成代码...
9 ========== 生成:  成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

那么什么是前向申明呢?

#pragma once
#include "A.h"class A;  //前向申明
class B
{
public:B();~B();A a_;  //不可实例化
};

这样仍然是错误的,因为前向申明是不可实例化的。

编译提示:

1>------ 已启动生成:  项目: test, 配置: Debug Win32 ------
1>  B.cpp
1>g:\cpp\代码\test\test\a.h(10): error C2146: 语法错误: 缺少“;”(在标识符“b_”的前面)
1>g:\cpp\代码\test\test\a.h(10): error C4430: 缺少类型说明符 - 假定为 int。注意:  C++ 不支持默认 int
1>  A.cpp
1>g:\cpp\代码\test\test\b.h(11): error C2079: “B::a_”使用未定义的 class“A”
1>  正在生成代码...
========== 生成:  成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

很简单的处理,只需要使用指针即可。 经过试验 引用也可。

 1 #pragma once
 2 #include "A.h"
 3
 4 class A;
 5 class B
 6 {
 7 public:
 8     B();
 9     ~B();
10
11     A *a_;
12 };

嵌套类:Demo

 1 #include <iostream>
 2 using namespace std;
 3
 4
 5 class Outer
 6 {
 7     class Inner
 8     {
 9     public:
10         void fun()
11         {
12             cout << "Inner:Fun...." << endl;
13         }
14     };
15
16 public:
17     Inner obj_;
18     void fun()
19     {
20         cout << "Outer:fun..." << endl;
21         obj_.fun();
22     }
23
24 };
25
26 int main(void)
27 {
28     Outer o;
29     o.fun();
30 }

## 从作用域的角度看,嵌套类被影藏在外围类中,该类名只能在外围类中使用。如果在外围类的作用域中使用该类名时,需要加名字限定;

##嵌套类中的成员函数可以再它的类体外定义;

##嵌套类的成员函数对外围类的的成员没有访问权,反之亦然。

##嵌套类仅仅是语法上的嵌入

 1 #include <iostream>
 2 using namespace std;
 3
 4
 5 class Outer
 6 {
 7     class Inner
 8     {
 9     public:
10         void fun();
11     };
12
13 public:
14     Inner obj_;
15     void fun()
16     {
17         cout << "Outer:fun..." << endl;
18         obj_.fun();
19     }
20
21 };
22 void Outer::Inner::fun()
23 {
24     cout << "Inner:Fun...." << endl;
25 }
26
27 int main(void)
28 {
29     Outer o;
30     o.fun();
31 }

类体外申明只需要记住要加多个类名即可。

转载于:https://www.cnblogs.com/DLzhang/p/4584416.html

C++学习之路: 前向申明相关推荐

  1. 我的fNIRS学习之路第“零”期 — fNIRS学习资料汇总

    关注"心仪脑"查看更多脑科学知识的分享. 关键词:资料汇总.fNIRS 写在前边 功能性近红外光谱技术(functional Near-infrared spectroscopy, ...

  2. Redis学习之路(一)--下载安装redis

    redis学习之路--下载安装redis windows安装redis 1.下载redis 2.安装 3.查看是否安装成功 windows安装redis 1.下载redis 网址:https://gi ...

  3. [EntLib]微软企业库5.0 学习之路——第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——上篇...

    本文是为后面的学习之路做铺垫,简单介绍下企业库中的Validation模块的一些相关知识,包括Validation模块的简介.用途.使用方法.默认提供的多种验证器的介绍等. 一.简介及用途 在实际的项 ...

  4. 我的mongo学习之路

    mongo学习之路 mongodb的安装,在这里就不做介绍了,不管是windows还是mac,网上都有教程,可以自行学习一下~~~ 一.启动 mongod 复制代码 二.链接 mongo 复制代码 三 ...

  5. 开始了大概三四天的Rails学习之路

    最近因为一位极光推送朋友,我开始了大概三四天的Rails学习之路,最终达到的水平是可以比较轻松地做出大部分功能,然后自我感觉可以自如地按照Rails的设计思想去思考.由于编程的日益流行,我结识了越来越 ...

  6. 数据清洗的基本流程_数据分析小白学习之路(三)——Excel多练熟能生巧

    谈到数据分析,我们可能第一时间想到python.SQL.Tableau.帆软.R等,但是这些软件.语言要入门掌握.系统学习起来耗时较长.这时候不得不提到excel这个"平平无奇数分小能手&q ...

  7. excel取整函数_数据分析小白学习之路(三)——Excel多练熟能生巧

    谈到数据分析,我们可能第一时间想到python.SQL.Tableau.帆软.R等,但是这些软件.语言要入门掌握.系统学习起来耗时较长.这时候不得不提到excel这个"平平无奇数分小能手&q ...

  8. JavaWeb学习之路——SSM框架之Spring(五)

    前情提要请看JavaWeb学习之路--SSM框架之Spring(四)                                         整合Spring和Mybatis框架 1.在项目的 ...

  9. F#学习之路(3) 如何组织程序(下)

    二.名称空间(namespace) 名称空间,将一组逻辑上相关的类型.模块放在一起,主要是为了解决名称冲突的问题,同时也便于更好的理解程序结构.F#的名称空间概念及定义与C#基本相似. 1.定义名称空 ...

最新文章

  1. 【转载】Python的运行原理(编译过程及执行原理)
  2. linux 自动启动shell 和 init概述
  3. POJ 1118 求平面上最多x点共线
  4. WebPack在多页应用项目中的探索
  5. 蓝桥杯C语言指数计算,蓝桥杯 算式900!!!!自己编的程序出毛病 了 求大神帮忙!~...
  6. 【USACO】电子游戏 有条件的背包
  7. 新年快乐,送一台新款华为笔记本!
  8. MYsql数据库误删mysql下的user内容,导致哪哪都不能登录
  9. 测试低频噪音软件,设计制作并验证0.1Hz10Hz超低频微弱噪音检测放大器要点
  10. mysql按照列构建索引_列存储索引增强功能–在线和离线(重新)构建
  11. android各版本源码下载
  12. 《莫烦Python3基础教程》学习笔记
  13. python whl文件安装_python whl文件怎么安装
  14. 计算机软件被放进回收站,电脑不能把文件放入回收站只能永久删除怎么办?
  15. weak_auth 小宁写了一个登陆验证页面,随手就设了一个密码。
  16. NRF52832-USB-Dangle-DIY笔记
  17. win7 安装IE11 教程
  18. 运营商精准大数据外呼系统
  19. Python3.8+win7
  20. LoadRunner--并发测试(多用户)

热门文章

  1. C++基础教程之字符串
  2. React学习笔记2017-12-31
  3. mysql下载安装使用教程
  4. 改变图片局部透明度,实现透明度根据位置不而渐变
  5. 《众妙之门——移动交互体验设计》—— 1.2 物物互联
  6. Python基础学习2--字符串
  7. 测试sql server服务是否配置正确
  8. hadoop2.7.1安装初上手
  9. RHEL/Centos7下使用EPEL和REMI源
  10. 解决vmware“二进制转换和长模式与此平台兼容.....”问题