C++学习之路: 前向申明
引言:
有种特殊情况,当两个类需要相互引用形成一个”环形“引用时,无法先定义使用。 这时候需要用到前向申明
但是前向申明的类不能实例化。
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++学习之路: 前向申明相关推荐
- 我的fNIRS学习之路第“零”期 — fNIRS学习资料汇总
关注"心仪脑"查看更多脑科学知识的分享. 关键词:资料汇总.fNIRS 写在前边 功能性近红外光谱技术(functional Near-infrared spectroscopy, ...
- Redis学习之路(一)--下载安装redis
redis学习之路--下载安装redis windows安装redis 1.下载redis 2.安装 3.查看是否安装成功 windows安装redis 1.下载redis 网址:https://gi ...
- [EntLib]微软企业库5.0 学习之路——第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——上篇...
本文是为后面的学习之路做铺垫,简单介绍下企业库中的Validation模块的一些相关知识,包括Validation模块的简介.用途.使用方法.默认提供的多种验证器的介绍等. 一.简介及用途 在实际的项 ...
- 我的mongo学习之路
mongo学习之路 mongodb的安装,在这里就不做介绍了,不管是windows还是mac,网上都有教程,可以自行学习一下~~~ 一.启动 mongod 复制代码 二.链接 mongo 复制代码 三 ...
- 开始了大概三四天的Rails学习之路
最近因为一位极光推送朋友,我开始了大概三四天的Rails学习之路,最终达到的水平是可以比较轻松地做出大部分功能,然后自我感觉可以自如地按照Rails的设计思想去思考.由于编程的日益流行,我结识了越来越 ...
- 数据清洗的基本流程_数据分析小白学习之路(三)——Excel多练熟能生巧
谈到数据分析,我们可能第一时间想到python.SQL.Tableau.帆软.R等,但是这些软件.语言要入门掌握.系统学习起来耗时较长.这时候不得不提到excel这个"平平无奇数分小能手&q ...
- excel取整函数_数据分析小白学习之路(三)——Excel多练熟能生巧
谈到数据分析,我们可能第一时间想到python.SQL.Tableau.帆软.R等,但是这些软件.语言要入门掌握.系统学习起来耗时较长.这时候不得不提到excel这个"平平无奇数分小能手&q ...
- JavaWeb学习之路——SSM框架之Spring(五)
前情提要请看JavaWeb学习之路--SSM框架之Spring(四) 整合Spring和Mybatis框架 1.在项目的 ...
- F#学习之路(3) 如何组织程序(下)
二.名称空间(namespace) 名称空间,将一组逻辑上相关的类型.模块放在一起,主要是为了解决名称冲突的问题,同时也便于更好的理解程序结构.F#的名称空间概念及定义与C#基本相似. 1.定义名称空 ...
最新文章
- 【转载】Python的运行原理(编译过程及执行原理)
- linux 自动启动shell 和 init概述
- POJ 1118 求平面上最多x点共线
- WebPack在多页应用项目中的探索
- 蓝桥杯C语言指数计算,蓝桥杯 算式900!!!!自己编的程序出毛病 了 求大神帮忙!~...
- 【USACO】电子游戏 有条件的背包
- 新年快乐,送一台新款华为笔记本!
- MYsql数据库误删mysql下的user内容,导致哪哪都不能登录
- 测试低频噪音软件,设计制作并验证0.1Hz10Hz超低频微弱噪音检测放大器要点
- mysql按照列构建索引_列存储索引增强功能–在线和离线(重新)构建
- android各版本源码下载
- 《莫烦Python3基础教程》学习笔记
- python whl文件安装_python whl文件怎么安装
- 计算机软件被放进回收站,电脑不能把文件放入回收站只能永久删除怎么办?
- weak_auth 小宁写了一个登陆验证页面,随手就设了一个密码。
- NRF52832-USB-Dangle-DIY笔记
- win7 安装IE11 教程
- 运营商精准大数据外呼系统
- Python3.8+win7
- LoadRunner--并发测试(多用户)
热门文章
- C++基础教程之字符串
- React学习笔记2017-12-31
- mysql下载安装使用教程
- 改变图片局部透明度,实现透明度根据位置不而渐变
- 《众妙之门——移动交互体验设计》—— 1.2 物物互联
- Python基础学习2--字符串
- 测试sql server服务是否配置正确
- hadoop2.7.1安装初上手
- RHEL/Centos7下使用EPEL和REMI源
- 解决vmware“二进制转换和长模式与此平台兼容.....”问题