代码之家  ›  专栏  ›  技术社区  ›  huahsin68

有没有关于内部类的解决方案或编程技巧?

c++
  •  1
  • huahsin68  · 技术社区  · 14 年前

    我在这儿吃点甜头。希望你们能分享一些编程技巧。只是想知道如果我做下面的代码是否是一个好的编程实践。

    class Outer {
    public:
       class Inner {
       public:
          Inner() {}
       }
    
       Outer() {}
    };
    

    结构 我只希望我的结构公开给我的类,而不是全局的。但这里的情况不同,我现在用的是一门课?你们以前遇到过这样的情况吗?非常感谢您的任何建议;)

    5 回复  |  直到 14 年前
        1
  •  2
  •   Kornel Kisielewicz    14 年前

    我将把答案分成两部分:

    1. 对于只组织代码的情况,应该使用名称空间而不是类——如果内部类不是只从类内部处理的实体(特别是仅在类中构造的实体),那么内部类是一个好主意——另一个示例STL函数对象。
    2. 在C++中,结构和类之间没有任何区别,除非结构默认存在公共成员。因此,当你有课的时候没有什么真正的区别——这更多的是一个风格的问题。
        2
  •  2
  •   Kevin Le - Khnle    14 年前

    在许多情况下,这是一个很好的做法。下面是一个我们实现链接列表的地方:

    template <class T>
    class MyLinkList {
      public:
    class Node {
        public:
        Node* next;
        T data;
        Node(const T& data, Node* node) : next(node), data(data) {}
    };
    
    class Iterator {
        public:
        Node* current;
        Iterator(Node* node) : current(node) {}
        T& operator*() { return current->data; }
        void operator++(int) { current = current->next; }
        bool operator!=(int) { return current != NULL; }
    };
    
      private:  
    Node* head;
    

    }

    以上只是不完整或不可编译的片段。重点是说明Node和Iterator是MyLinkList类的内部类。之所以这样做是为了说明这样一个事实,即节点和迭代器并不独立于自身,但它们需要由MyLinkList限定(例如 MyLinkList::迭代器

        3
  •  2
  •   Michael Aaron Safyan    14 年前

    这纯粹是风格问题,但是我认为C++社区中使用名称空间通常更为常见。 detail 对于纯粹是帮助程序或纯粹用于其他类的实现的类。使用命名空间代替内部类有几个优点,其中包括:更大的兼容性(例如,编译器如何解析内部类中的名称在Visual C++和GCC之间可能是难以置信的不同),更多的封装(在内部/外部变量中,内部类对实例的成员有更大的访问权限)。更容易实现(您不必每次都在实现文件中完全限定helper类,因为您可以在“.cpp”源文件中放置using指令)。如果要使用内部类,则需要有意识地决定将其作为API的一部分。

    使用命名空间

    namespace collection
    {
         namespace detail 
         {
             class LinkedListNode
             {
                 //...
             };
         }
    
         class LinkedList
         {
              // ...
         };
     }
    

    使用内部类

    namespace collection
    {
          class LinkedList
          {
               // ...
               class LinkedListNode
               {
                   // ...
               };
               // ...
           };
     }
    
        4
  •  0
  •   jwismar    14 年前

    这不是每天都有的事,但也不是闻所未闻。如果有一个类(内部的)只有在客户机使用外部的时候才对客户机程序有意义,那么您可以这样做。

        5
  •  0
  •   Ólafur Waage    14 年前

    如果只希望某个类在某个文件中公开,则可以在该文件中使用未命名的命名空间。那么名称空间中的任何代码都只能在该文件中使用。

    namespace
    {
        //stuff
    }