1

私は2つのクラスを持っていてABどこBでクラスのオブジェクトを使用していますAか、このようなもの

class A {
    private:
        int foo_;

    A(const int &foo): foo_(foo) {}
}

class B {

    // STUFF

    inline C operator()(A a)
}

現時点では、両方の定義を.hファイルに入れており、コードは正しくコンパイルおよび実行されます。

私の質問は次のとおりです。たとえば、コード行をファイルに移動して個別にコンパイルおよびリンクすることにより、 class の実装をどの程度マスクできますか? メンバーとメソッド (外部ユーザーが直接アクセスしないものすべて)の実装をマスクできますか? どのように?どの C++ キーワードを使用すればよいですか?A.cppprivate

事前にどうもありがとうございました。

4

3 に答える 3

4

マスキングの実装は、PIMPL イディオムによって、またはファクトリ メソッド パターンである単純なポリモーフィズムを使用して行うことができます。IA基本的に、インターフェイス クラスを作成します。次のように言います。

/* File: A.h */
#include <memory> /* For std::shared_ptr */
class IA;
/* Change the line below to boost::shared_ptr<> or
 * another implementation of a shared-pointer.
 * Read more:
 * http://en.wikipedia.org/wiki/Smart_pointer#shared_ptr_and_weak_ptr
 */
typedef std::shared_ptr<IA> APtr;

class IA {
public:
    static APtr Create(const int foo);
    IA(){}
    virtual ~IA(){}
    virtual void somePublicMethod() = 0;
};

あなたの A.cpp には、その実装があります:

/* File: A.cpp */
#include "A.h"

class A : public IA
{
public:
    A(const int foo):foo_(foo){}
    void somePublicMethod(){/* Your awesome implementation goes here */}
};

APtr IA::Create(const int foo)
{
    return APtr(new A(foo));
}

このようにして、インターフェイスのみを渡し、内部が CPP ファイルにあるパブリック メソッドのみを外部に公開します。

利点:

  • 実装をユーザーから完全に隠す

短所:

  • 非表示にするすべてのクラスのインターフェイスを作成する必要があります
  • ユーザーはファクトリ メソッドを呼び出してインスタンスを作成する必要があります。たとえばCreate()、上記の例では。
  • クラス インスタンスは常にスタックではなくヒープ メモリ内にある必要があります。つまり、実装インスタンスは常にポインタでなければなりません。(続きを読む:ヒープ vs. スタック メモリ)
于 2013-06-11T08:08:18.963 に答える
2

pImpl イディオムが隠せるものについて:

  • すべての関数定義(コンストラクターとその初期化リストを含むその実装)をImplクラスに移動できます
  • これにより、クラスの動作に影響を与える場所を除いて、プライベート型、データメンバー関数を Impl クラスに入れることができます (たとえば、プライベートコンストラクター、デストラクタ、および演算子は、クラスのユーザーに影響を与えます)。
  • クラスの静的データメンバーの定義と初期化を実装ファイルに移動できます
  • Arneのコメントによると、プライベート基本クラスは通常、実装に移動できます(パブリックまたは保護されたデータメンバーでそれらからtypedefなどを使用していない限り、それは彼のコメントによると醜いです!)
于 2013-06-11T08:14:39.543 に答える
2

必要がない場合はC operator()(A a)、次のようinlineにパラメーターを前方宣言できますA

class A;

次に、その定義を別のヘッダーに移動して、使用されている場所に含めることができます。

前方宣言の詳細は次のとおりです。

于 2013-06-11T08:22:09.960 に答える