拆分C ++类声明

时间:2012-05-04 21:26:22

标签: c++

我想知道我是否可以拆分C ++类声明

原创课程

    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();
    };

编辑: 我希望如此:

  1. 我可以更改类的实现,并且类的用户是透明的
  2. 用户查看信息的次数比
  3. 更容易
  4. 如果我更改了类的实现,请更改私有属性和方法我不想为类的用户更改.h

5 个答案:

答案 0 :(得分:5)

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

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;
};

my_object.cpp:

struct my_object::impl {
  void fun() { do stuff...}

  void pfun() { do other stuff... }

  int private_member;
};

my_object::my_object() : pimpl(new impl) {}
my_object::my_object(my_object const& o) : pimpl(new impl(*o.pimpl) {}
my_object::~my_object() {}

my_object& my_object::operator = (my_object o) { swap(pimpl, o.pimpl); return *this; }

void my_object::fun() { pimpl->fun(); }
void my_object::pfun() { pimpl->pfun(); }

正如您所看到的,这需要很多工作并需要堆。一切都在平衡......在你需要的时候使用。

答案 1 :(得分:1)

如果你的目的是简单地减少标题中的混乱,你可以在课程中间包含一个文件:

class P
{
#include "P.private_parts"

   protected:
       int x;
   public:
       P();
       int getX();
};

答案 2 :(得分:0)

这样的东西?

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();

};

答案 3 :(得分:0)

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

// P_Hetitage类定义

class P_Heritage {
      protected:
                int id;
                //some really secret method
                int secretMethod();
}

// P类定义

class P : private P_Heritage {
      protected:
                int x;
      public:
             P();
             int getX();
};
  

下面简单说明继承的工作原理:

     

将类P_Heritage继承为:

     

公开

     
      
  1. public 元素对P类是 public   
  2. 受保护的元素属于P类的私有
  3.   
     

私有

     
      
  1. 公共元素是P类的私有
  2.   
  3. 受保护的元素属于P类的私有
  4.   
     P类无法看到

P_Heritage的私有元素

答案 4 :(得分:-1)

无法真正拆分C ++类定义。您所能做的就是实现一个运行时抽象,它将使用像PIMPL这样恶心的黑客来防火墙源代码。