在一个类的内部定义另一个类或结构体,我们称之为嵌套类(nested class),或者嵌套类型。之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现

虽然嵌套类在外围类内部定义,但它是一个独立的类,基本上与外围类不相关。它的成员不属于外围类,同样,外围类的成员也不属于该嵌套类。嵌套类的出现只是 告诉外围类有一个这样的类型成员供外围类使用。并且,外围类对嵌套类成员的访问没有任何特权,嵌套类对外围类成员的访问也同样如此,它们都遵循普通类所具 有的标号访问控制。

前面说过,之所以使用嵌套类的另一个原因是达到底层实现隐藏的目的。为了实现这种目的,我们需要在另一个头文件中定义该 嵌套类,而只在外围类中前向声明这个嵌套类即可。当然,在外围类外面定义这个嵌套类时,应该使用外围类进行限定。使用时,只需要在外围类的实现文件中包含 这个头文件即可。

另外,嵌套类可以直接引用外围类的静态成员、类型名和枚举成员,即使这些是private的。

实例如下:

  1. #ifndef NESTCLASS_H_
  2. #define NESTCLASS_H_
  3. class A
  4. {
  5. public:
  6. A();
  7. ~A();
  8. void operate();
  9. private:
  10. class B;
  11. B* m_b;
  12. };
  13. #endif
  14. #include "nestclass.h"
  15. #include <iostream>
  16. using namespace std;
  17. class A::B
  18. {
  19. public:
  20. B(){}
  21. ~B(){}
  22. void operate()
  23. {
  24. cout<<"B operate!"<<endl;
  25. }
  26. };
  27. A::A()
  28. {
  29. }
  30. A::~A()
  31. {
  32. }
  33. void A::operate()
  34. {
  35. m_b = new B;
  36. cout<<"A operate!"<<endl;
  37. m_b->operate();
  38. }
  39. #include "nestclass.h"
  40. void main()
  41. {
  42. A a;
  43. a.operate();
  44. }

在嵌套类的定义被看到之前我们只能声明嵌套类的指针和引用,如上面在A中定义为B m_b而不是B* m_b将会引发一个编译错误。关于C++嵌套类的详细用法请参考《C++ Primer 第三版》P551

复制自德问 的 freeboy1015 原地址 http://www.dewen.io/q/9309

转载于:https://www.cnblogs.com/littleby/p/4984983.html

c++类的嵌套(1)相关推荐

  1. python中类的嵌套_python类的嵌套

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 在.net和java语言中看到过嵌套类的实现,作为外部类一个局部工具还是很有用的 ...

  2. 类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

     1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPush ...

  3. c++ 嵌套私有类_嵌套类和私有方法

    c++ 嵌套私有类 当您在另一个类中有一个类时,他们可以看到彼此的private方法. 在Java开发人员中并不为人所知. 面试过程中的许多候选人说, private是一种可见性,它使代码可以查看成员 ...

  4. C++ 模板类的嵌套

    模板类的嵌套 使用函数模板,当参数是自定义数据类型(如结构体,类)时,需要通过第三代具体化自定义数据类型来解决问题. 那么对于类模板中的成员对象的数据类型也是自定义数据类型呢. 实际上,只要类中包括了 ...

  5. 类中嵌套子类如何JSON转换

    在开发中会经常遇到一个Java类中嵌套List集合,集合中又是另外一个类,那么在Json转换的时候可能会遇到无法转换,下面这个方法就可以完美解决 public class IM_UserAccount ...

  6. (教学思路 C#之类五)类的分类(静态类、实例类、嵌套类、结构、简单的抽象类、简单的密封类)...

    本节课我们来学习类的扩展分类,看我的标题中就罗列出了类的分类,类按照声明方式和功能定义共分为这六种类,实例类就是我们一直在用的类,class关键字前没有其他的修饰符,之前已经有很多实例类的使用方法了, ...

  7. 实体类多层嵌套 遍历_多层嵌套的json数据

    很多时候我们见到的json数据都是多层嵌套的,就像下面这般: {"name":"桔子桑","sex":"男"," ...

  8. day20Map集合(HashMapTreeMap)Collections工具类集合嵌套

    Map接口的概述         将键映射到值的对象.         Map不能包含重复的键;         每个键可以映射到最多一个值. Map接口与Collection接口有什么区别?     ...

  9. 实体类多层嵌套 遍历_JS获取元素多层嵌套思路详解

    如果一段html嵌套过多,在js中获取还是比较麻烦的,我写了几套方案,大家可以参考参考,如果你有好的方法,也分享出来,让我们瞧瞧. HTML: 元素多层嵌套,JS获取问题 span span 1 2 ...

最新文章

  1. docker如何移除所有的mysql_docker容器删除了,link怎么还在?
  2. 微软职位内部推荐-Senior Software Engineer-Eco
  3. 要建设数据中心吗?IDC数据中心的四大要求来了解一下!
  4. 人生何为苦何为乐何为幸福
  5. 爬取小说《重生之狂暴火法》 1~140章
  6. Docker安装MySQL 8 for Mac(图文详解)
  7. nest 设置密码_如何设置Nest Cam
  8. 欢迎关注个人微信公众账号~
  9. linux alarm函数clock,linux c之alarm函数的使用,定时器的实现
  10. 考研计算机专业英语面试自我介绍,计算机研究生面试英文自我介绍
  11. 关于LCD1602液显的使用细则
  12. web程序无法访问:The requested resource () is not available.错误
  13. java.sql.timestamp_java.sql.Date和java.sql.Timestamp转换
  14. Oracle卸载的全过程
  15. 某宝上关于PMP低价续证,可信吗?
  16. 网络基础之网络协议篇
  17. 【展馆设计】互动多媒体投影有哪些实用价值
  18. Wdf框架之WdfObject状态机(3)-前篇
  19. [网鼎杯 2020 玄武组]SSRFMe【redis主从复制ssrf】
  20. Python对阿里云物联网MQTT设备接入端开发

热门文章

  1. Access to the path ‘‘ is denied.解决方案
  2. Proxmox VE中出现TASK ERROR: command ‘apt-get update‘ failed: exit code 100的解决方法
  3. 针对github权限导致hexo部署失败的解决方案
  4. CORS - 引入预检请求的动机是什么?
  5. 如何在电脑上删除磁盘碎片
  6. 教你win7显卡驱动如何安装,win7电脑显卡驱动的安装方法
  7. 华为电脑c盘哪些文件可以删除,c盘可以删除哪些文件
  8. ubuntu20.04系统 ros noetic下安裝orbslam2
  9. RabbitMQ的工作模式Routing 路由,test测试代
  10. 常见移动机器人轮直径校准实验思路