2011-07-07 4 views
5

私はサウンドライブラリ(OpenALを使用)に取り組んでおり、FMODが提供するインターフェイスからインスピレーションを得て、インターフェイスat this linkを見ることができます。このコードはプライベートコンストラクタのみを持つクラスのインスタンスをどのように作成しますか?

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

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

編集:OPの質問を明確にするために、プライベートコンストラクタを使用してクラスのインスタンスを作成する方法を質問していません。質問はリンクに掲載されています。静的メソッドやフレンド関数はありません。

ありがとうございました。

+0

touさんが友だちのメンバーを使用しようとしました – zabulus

+0

そのインターフェイスはやや劣っています。一般に、「システム」クラスまたは「神」クラスは、アンチパターンとして知られています。 – MSalters

+0

publicまたはfriendコンストラクタを持ち、それを返すサブクラスのインスタンスを作成していますか? – jcoder

答えて

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を宣言したが、それは単に名前空間を汚染です。

私はそのリンクにアクセスすることはできませんが、別の方法は工場のパターンかもしれません。私はちょっと推測しています。

+4

OPが投稿したインターフェイスには「静的メソッド」はありません。 –

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

+1

工場は依然としてCTORにアクセスできる必要があります。 – Dennis

7

ソースコードを見ずに言うのは難しいです。しかし、FMODはグローバル変数とその周りの悪い "OOP" C++ラッパーと100%Cです。

ソースコードがないと、.hファイルで再生される悪意のあるもののいくつかは、別のヘッダーファイルを使用してコードがコンパイルされている可能性があります(明らかに非標準)を使用しているコンパイラと比較します。

私の推測では、C++ラッパーのソースコードは静的メソッドを定義しているか、あるいはすべてが実際にはグローバルであれば、オブジェクトは実際には作成されず、トリックもC++オブジェクトシステム確かに目的があると思う。どうやら、すべてのディスパッチは静的であるため、これは公式ではありませんが、とにかく私が知っているC++の実装ではうまく動作します。

C + +の観点からは、どんなことがあっても、かなり醜いものではありません。

+1

+1は質問を読んだ唯一の回答者です。そして、正しいことのために、これを行うための標準的な仲間の方法はありません。 – interjay

+0

明らかに、より良い仕事は私のインターフェースを再考すると思います。 – enigma

1

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

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

[システムオブジェクトを取得するには渡すポインタがすぐfmod.hヘッダで宣言されたCの構造体へのポインタにキャストさですぐそこです。

違いを教えることができるデータメンバーのないクラスですから?

+0

あなたはポインタを格納する場所にアドレスを渡すC関数を呼び出します(実際にはこの関数は何も表示されません)。実際のCオブジェクトにデータメンバがないことは確かではありません。なぜなら、移植不可能な非標準トリッキーがここで使用されているため、ライブラリが実際には異なるヘッダを使用してコンパイルされていて、ライブラリユーザーのために。 – 6502

関連する問題