6

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

原班

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

我想在 .h 中只显示公共和受保护的方法和属性,并在其他地方声明私有的,类的用户看不到它。

通缉类声明:

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

编辑:我想要那个:

  1. 我可以更改类的实现并且对于类的用户是透明的
  2. 用户更容易看到更少的信息而不是更多的信息
  3. 如果我更改类的实现,更改私有属性和方法我不想更改类用户的 .h
4

5 回答 5

5

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

我的对象.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(); }

如您所见,这需要大量工作并且需要堆。一切都在平衡......在你需要的时候使用。

于 2012-05-04T22:36:46.560 回答
1

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

class P
{
#include "P.private_parts"

   protected:
       int x;
   public:
       P();
       int getX();
};
于 2012-05-04T22:20:08.957 回答
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();

};
于 2012-05-04T21:37:40.163 回答
0

不可能真正拆分 C++ 类定义。你所能做的就是实现一个运行时抽象,它将通过使用像 PIMPL 这样令人作呕的黑客来保护源代码。

于 2012-05-04T21:44:44.257 回答
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. 公共元素对类 P是公共的
  2. 受保护的元素是P 类私有的

私人的

  1. 公共元素是P 类私有的
  2. 受保护的元素是P 类私有的

P_Heritage 的私有元素不能被类 P 看到

于 2019-12-23T15:52:58.100 回答