zoukankan      html  css  js  c++  java
  • C++嵌套类的使用方法

         在一个类的内部定义另一个类,我们称之为嵌套类(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
  • 相关阅读:
    CF446C [DZY loves Fibonacci]
    [BZOJ2286] 消耗战
    [CF Round #278] Tourists
    BZOJ2553 [BJWC2011]禁忌
    NOI2018D2T1 屠龙勇士
    BZOJ2333 棘手的操作
    bzoj4196: [Noi2015]软件包管理器(树链剖分)
    bzoj1833: [ZJOI2010]count 数字计数(数位DP)
    bzoj1026: [SCOI2009]windy数(数位DP)
    bzoj3631: [JLOI2014]松鼠的新家(树上差分)
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167980.html
Copyright © 2011-2022 走看看