6

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. クラスの実装を変更する場合、プライベート属性とメソッドを変更します クラスのユーザーの .h を変更したくない
4

5 に答える 5

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

ご覧のとおり、これは大変な作業であり、ヒープが必要です。すべてがバランスよく…必要な時に使えます。

于 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

C++クラス定義を真に分割することはできません。あなたができることは、PIMPLのような嫌なハックを使用してソースコードをファイアウォールで保護するランタイム抽象化を実装することだけです。

于 2012-05-04T21:44:44.257 に答える
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

次のように 2 番目の部分を継承できます。

//クラス 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 に答える