美文网首页C/C++
(二十八)内部类和名字空间

(二十八)内部类和名字空间

作者: RGiskard | 来源:发表于2018-11-06 21:42 被阅读0次
    • 把一个类定义在另一个类的内部,就称为内部类。内部类可以有效避免名字冲突问题。而名字空间是解决该问题的终极解决方案,内部类较为常用,名字空间不太常用。

    内部类

    class A
    {
    public:
        //定义内部类
        class B
        {
        public:
            char name[64];
        }
    public:
        A()
        {
            
        }
    };
    
    A::B inner;
    strcpy(inner.name,"hello");
    

    此时内部类的名字为A::B

    • 内部类若被private或protected修饰时,则被隐藏在内部,外部无法访问
    • 内部类可以自由访问外部类的private或protected成员
    • 内部类B和外部类A既不是父类和子类的关系,也不是朋友关系
    • A::B和C::B是不冲突的,虽然名字一样,但这是两个不一样的类
    内部类的分离式写法
    ///A.h
    class A
    {
    public:
        class Inner
        {
        public:
            Inner();
            void Set(int v);
        private:
            int value;
        }
    public:
        A();
        Inner Get();
    public:
        Inner m_in;
    };
    
    ///A.cpp
    //内部类的定义
    A::Inner::Inner() : value(11)
    {
        
    }
    void A::Inner::Set(int v)
    {
        this->value = v;
    }
    //外部类的定义
    A::A()
    {
        
    }
    A::Inner A::Get()  //注意,返回值是Inner类型的,要写成A::Inner
    {
        return m_in;
    }
    
    enum类型
    • enum用于定义枚举类型,本质上等同于int型

      //enum定义一个新的整数类型Weekday,定义了7个字面常量,Sunday(0),Monday(1)...
      enum Weekday
      {
          Sunday,
          Monday,
          ...
      };
      
      Weekday day = Monday;
      //day的值为1,占有4个字节
      
      //black为0,red指定为2,green为red+1为3,blue指定为5
      enum Color
      {
          black,
          red = 2,
          green,
          blue = 5
      };
      
    内部enum类型

    在类里定义enum类型

    class Painter
    {
    public:
        enum Color
        {
            RED = 0xFF0000,
            GREEN = 0x00FF00,
            BLUE = 0x0000FF
        };
    };
    
    Painter::Color clr = Painter::RED;
    

    名字空间

    把很多名字(类名,函数名,全局变量名)定义在一个空间里,然后用一个范围符做前缀

    名字空间的定义
    namespace tinyxml
    {
        class Document
        {
            
        };
        class Element
        {
            
        };
    }
    
    tinyxml::Document doc;
    tinyxml::Element elem;
    
    分离式写法
    ///tinyxml.h
    namespace tinyxml
    {
        class Document
        {
        public:
            Document();
            int Open();
            int AddElement(const Element& elem)
        };
        class Element
        {
        public:
            Element();
        public:
            char name[32];
            char value[64];
        };
    }
    
    ///tinyxml.cpp
    #include "tinyxml.h"
    namespace tinyxml
    {
        Element::Element()
        {
            
        }
        Document::Document()
        {
            
        }
        ...
    }
    
    using语句:解除前缀

    在main函数中使用名字空间的名字需要加上前缀tinyxml::,这有些麻烦,为了避免,在main函数开头用using语句

    #include "tinyxml.h"
    using namespace tinyxml;
    
    int main()
    {
        Document doc;//前面的tinyxml::可以忽略
        return 0;
    }
    

    仅使用名字空间的部分名字

    using tinyxml::Document;
    

    相关文章

      网友评论

        本文标题:(二十八)内部类和名字空间

        本文链接:https://www.haomeiwen.com/subject/kcupxqtx.html