5

私はサウンド ライブラリ (OpenAL を使用) に取り組んでおり、FMOD によって提供されるインターフェイスからインスピレーションを得て、このリンクでインターフェイスを確認できます。

FMOD インターフェイスからわかるように、Sound、Channel、ChannelGroup などのいくつかの概念を提供しました。これらのクラスにはすべてプライベート コンストラクターがあり、たとえば、Sound を作成する場合は、提供されている関数createSound()を使用する必要があります。 System クラスによって (Channel または ChannelGroup を作成する場合と同じ)。

同様のメカニズムを提供したいのですが、背後でどのように機能するのかわかりません。たとえば、関数createSound()はどのようにしてサウンドの新しいインスタンスを作成できますか? コンストラクターはプライベートであり、Sound インターフェースからは、静的メソッドやフレンドシップはありません。いくつかのパターンが使用されていますか?

編集:OPの質問を明確にするために、プライベートコンストラクターを使用してクラスのインスタンスを作成する方法を尋ねていません。質問は投稿されたリンクにあります。プライベートコンストラクターを持ち、静的メソッドまたはフレンドを持たないクラスのインスタンスはどのように作成されますか?機能。

ありがとう。

4

4 に答える 4

7

ソースコードを見ないとなんとも言えません。ただし、FMOD は 100% C であり、グローバル変数があり、その周りに不適切な「OOP」C++ ラッパーがあるようです。

ソースコードがなく、.h ファイルで実行されるいくつかの悪いトリックを考えると、コードは別のヘッダーファイルを使用してコンパイルされ、コンパイラで (明らかに非標準であっても) たまたま動作する可能性があります。彼らは使用しています。

私の推測では、C++ ラッパーの実際の (未公開の) ソース コードは静的メソッドを定義しているか、あるいはすべてが実際に単なるグローバルである場合、オブジェクトは実際には作成されておらず、C++ オブジェクト システムが存在すると思わせるトリックが行われています。まさにオブジェ。どうやらすべてのディスパッチは静的であるため、これは (正式には合法ではありませんが) 私が知っている C++ 実装でとにかく動作する可能性があります。

彼らが何をしたにせよ、C++ の観点から見ると、それは非常に醜く、非準拠です。

于 2011-07-07T08:09:44.493 に答える
1

インスタンスを作成することはありません。ファクトリ関数はヘッダーにあります

/*
    FMOD System factory functions.
*/
inline FMOD_RESULT System_Create(System **system)
{ return FMOD_System_Create((FMOD_SYSTEM **)system); }

System object を取得するために渡すポインターは、すぐに fmod.h ヘッダーで宣言された C 構造体へのポインターにキャストされます。

違いを見分けることができるデータメンバーのないクラスなので?

于 2011-07-07T09:06:53.480 に答える
0
struct Foo {
    enum Type {
        ALPHA,
        BETA_X,
        BETA_Y
    };
    Type type () const;
    static Foo alpha (int i) {return Foo (ALPHA, i);}
    static Foo beta  (int i) {return Foo (i<0 ? BETA_X : BETA_Y, i);}
private:
    Foo (Type, int);
};

create_alphaは宣言された無料friendの関数である可能性がありますが、それは名前空間を汚染しているだけです。

そのリンクにアクセスできないのではないかと思いますが、別の方法はファクトリパターンである可能性があります。今、少し推測しています。

于 2011-07-07T07:54:22.913 に答える
0

彼らのコメントが言うように、それは工場のパターンです。

/*
    FMOD System factory functions.
*/
inline FMOD_RESULT System_Create(System **system) { return FMOD_System_Create((FMOD_SYSTEM **)system); }

メソッドのソースが公開されていないため、何が起こっているのかを正確に言うのは困難FMOD_System_Createです。

ファクトリ パターンはオブジェクトを作成するためのメカニズムですが、生成される (サブ) クラスはファクトリ コールのパラメータに依存します。http://en.wikipedia.org/wiki/Factory_method_pattern

于 2011-07-07T08:06:23.827 に答える