11

私はライブラリを作成しました(それが何をするかは問題ではありません)。これには明らかにヘッダーファイルがあります。ここで、そのヘッダー ファイルのプライベート要素を非表示にしたいので、ライブラリを誰かに提供する場合、その人はパブリック メンバーのみを表示する必要があります (できれば、クラス定義はなく、関数定義以外は何も表示されません)。1 つの方法は、ライブラリの実際のクラスのインスタンスを作成するために使用されるある種の「init」メソッドを含む C スタイルのヘッダーを作成することです。ユーザーは、そのオブジェクトのポインターをすべての関数に渡す必要があります。仕事をする。

それは良い習慣ですか?

そのようなことを行うための他の公に認められた方法はありますか?

前もって感謝します。

4

6 に答える 6

6

パブリックに表示されるインターフェイスを作成できます。公開したい関数を含む抽象クラスを作成し、実装でそれを拡張します。

たとえば、インターフェースは次のとおりです。

class Interface {
public:
    virtual void publicMethod() = 0;
...
};

そして実装:

class Implementation : Interface {
public:
    virtual void publicMethod();
private:
    int hiddenMethod();
};

次に、Interface のシンボルのみをエクスポートします。ここで、ライブラリのユーザーが実際に実装である Interface のインスタンスを取得するには、ファクトリを提供する必要があります。

class Factory {
public:
    //can create and return an Implementation pointer, but caller will get an Interface pointer
    std::shared_ptr<Interface> getImplementationInstance();
}
于 2013-07-09T17:34:05.327 に答える
1

ダイナミック リンク ライブラリ (dll) を作成する必要があると思います。

このリンクを簡単に見てください。

于 2013-07-09T17:31:52.330 に答える
0

封筒/手紙の慣用句、橋のデザイン パターン、またはプロキシ パターンを調べてみるとよいでしょう。基本的に、パブリック メソッド呼び出しを内部 (プライベート) クラスに転送する外部 (パブリック) クラスを作成します。InnerClass.h ヘッダーは、OuterClass.cpp および InnerClass.cpp ソース ファイルにのみ表示/認識される必要があります。

これらの各パターンは、呼び出し元が実装に結合されないように、実装をインターフェイスから分離するメカニズムを提供します。大規模な C++ プロジェクトでコンパイラの依存関係を減らすために、これが必要になる場合があります。これを行うもう 1 つの一般的な理由は、実装の詳細を非表示にして、呼び出し元に 1 つの不透明なポインターのみが表示されるようにする場合です。

=======  OuterClass.h =====
class InnerClass; // forward declaration is all that's needed

class OuterClass {
    private:
        InnerClass *pInner;

    public:
        InnerClass();

        bool doSomething();
};

======= OuterClass.cpp ======
#include "OuterClass.h"
#include "InnerClass.h"

OuterClass::OuterClass() : 
    pInner(new InnerClass())
{
}

bool OuterClass::doSomething()
{
    return pInner->doSomething();
}
于 2013-07-09T17:37:45.973 に答える