拆分一个C++;类声明 我想知道我是否可以分割一个C++类声明< /p>

拆分一个C++;类声明 我想知道我是否可以分割一个C++类声明< /p>,c++,C++,原始类 class P { private: int id; //some really secret method int secretMethod(); protected: int x; public: P(); int getX(); }; 我想在.h中只显示public和protect

原始类

    class P
    {
        private: 
           int id;
           //some really secret method
           int secretMethod();
       protected:
           int x;
       public:
           P();
           int getX();
    };
我想在.h中只显示public和protected方法和属性,并在其他地方声明private,在这里类的用户看不到它

通缉类别声明:

    class P
    {
       protected:
           int x;
       public:
           P();
           int getX();
    };
编辑: 我想要这个:

  • 我可以更改类的实现,并且对于类的用户来说是透明的
  • 对于用户来说,查看更少的信息比查看更多的信息更容易
  • 如果我更改了类的实现,请更改私有属性和方法,我不想更改类用户的.h
  • 像这样的

    class P
    {
    private:
        class Impl
        {
        public:
           int id;
           //some really secret method
           int secretMethod();
        };
    
    private:
        Impl* _pimpl;
    
    protected:
        int x;
    
    public:
        P() : _pimpl(new P::Impl()) {}
        ~P() { delete _pimpl; } 
        int getX();
    
    };
    

    <>不可能真正地分割C++类定义。你所能做的就是实现一个运行时的抽象,它将使用一个恶心的黑客,比如piml来防火墙。

    如果你的目的是简单地减少你的报头中的混乱,你可以在你的类中包含一个文件:

    class P
    {
    #include "P.private_parts"
    
       protected:
           int x;
       public:
           P();
           int getX();
    };
    

    是的,这是可能的,但不是以直接的方式。以下是您要做的:

    my_object.h:

    struct my_object {
      void fun();
    
      my_object();
      my_object(my_object const&);
      ~my_object();
    
      my_object& operator = (my_object);
    
    protected:
      void pfun();
    
    private:
      struct impl;
      std::unique_ptr<impl> pimpl;
    };
    

    正如您所看到的,这需要大量的工作,并且需要堆。一切都在平衡中…需要时使用。

    您可以像这样继承第二部分:

    //类p_Hetitage定义

    class P_Heritage {
          protected:
                    int id;
                    //some really secret method
                    int secretMethod();
    }
    
    class P : private P_Heritage {
          protected:
                    int x;
          public:
                 P();
                 int getX();
    };
    
    //p类定义

    class P_Heritage {
          protected:
                    int id;
                    //some really secret method
                    int secretMethod();
    }
    
    class P : private P_Heritage {
          protected:
                    int x;
          public:
                 P();
                 int getX();
    };
    
    下面简单介绍继承的工作原理:

    继承p_类遗产为:

    公开

  • public元素是public类P
  • 受保护的元素属于私有P类
  • 私人

  • 公共元素属于私有P类
  • 受保护的元素属于私有P类
  • p_遗产的私有元素不能被p类看到


    pimpl习语可能就是您想要的,但是什么是
    int secretMethod()?为什么需要实际隐藏源代码?Pimpl习语也是一种减少编译时间的巧妙技术。不仅仅是为了隐藏东西。Off-topic.PIMPL非常糟糕,不应该使用。不,不,不。这根本不是拆分类。更不用说,Impl的定义仍然为标题所知……感谢您的评论。可能我太快了。我建议不要在代码中使用前缀“u”,除非您使用的是标准库。虽然在这种情况下,因为它不在全局范围内,但在很多情况下,您会遇到IDB,通常以名称冲突的形式暴露出来。“u”前缀有特殊的含义,取决于作用域和它后面的内容……您可能正在编写格式错误的程序。最好不要使用这个前缀来避免这一切。我相信你有充分的理由来解释为什么你认为Pimpl这个成语很糟糕。如果你能详细说明这些,这样OP就能做出合理的决定,那就太好了。@BenjaminLindley:不是我的答案,但是Pimpl的习惯用法——就像单例模式一样——存在过度使用的问题。将实现与公共接口隔离是一回事(即,库的客户端将在/usr/include/MyLib中看到什么)。当你发现代码库中的每一个类都被“粉刺”时,那就完全是另一回事了,因为这会使源代码难以调试,而且不必要地难以调试,只获得很少的收益。。我认为P.private_零件不可能是秘密。@Troncador:我不确定你想隐藏私人数据的原因是什么,因为当Tibor问你时,你没有详细说明。一个可能的原因是,您只是希望头文件不那么凌乱,所以我回答了如何解决这个问题。因此,在将来,请回答人们在你帖子的评论中向你提出的问题,这样每个人都可以清楚地知道你真正想要完成的是什么。但是,如果你想访问成员,代码完成在
    P.private\u parts
    中不起作用。。。