2011-10-19 19 views
0

C++のコードをC言語のコードに変換していますが、C言語のオブジェクトファクトリに相当するパターンはありますか?C++ではなくC言語のオブジェクトファクトリ

次のソースコードを検討してください。パラメータ(int type)に基づいて、ObjectFactory()関数は、ペディキュア型の構造体へのvoidポインタを返す必要があります。どのようにして、関数が返った後にポインタを持つことができるような方法で構造体をインスタンス化できますか?

typedef struct { 
    unsigned int a; 
    unsigned int b; 
    unsigned int c; 
} CThings ; 

typedef struct { 
    unsigned int d; 
    unsigned int e; 
    unsigned int f; 
} CPlaces ; 

void * ObjectFactory(int type) { 

    switch(type) { 
     case 5 : {   
      return ??? CPlaces ; 
      break; 
     } 
     case 35 : {   
      return ??? CThings ; 
      break; 
     } 
     default: { 
      // unknown type 
      return NULL ; 
     } 
    } 

    return NULL ; 
} 



int _tmain(int argc, _TCHAR* argv[]) 
{ 
    void * p = ObjectFactory(5); 

    // Do soemthing with the pointer. 
    CPlaces * places = (CPlaces*) p ; 

    places->d = 5 ; 
    places->e = 6 ; 
    places->f = 7 ; 


    return 0; 
} 
+4

これは、C++をC言語に変換することは、一見したところ特に不吉なことです。このような明らかに無意味な活動に従事している理由を説明してください。 –

+2

@ AlfP.Steinbach +1:あなたが書いた最高のコメント。 –

+0

'return(void *)new CPlaces();' –

答えて

5

どうmallocの使用に関する:

case 5: return malloc(sizeof(struct CPlaces)); 

不要をbreakためにすでに返した場合。必要に応じて、初期化をいくつか追加して戻すことができます。

発信者は、正しいタイプにポインタを戻すために実際のタイプを知る必要があります。これはおそらく、発信者のサイトで重複したswitch文になるでしょう。

0
#include <stdlib.h> 

typedef enum enum_ObjectType { 
    CPlaces_Object = 5, 
    CThings_Object = 35, 
} ObjectType; 

typedef struct struct_CThings { 
    unsigned int a; 
    unsigned int b; 
    unsigned int c; 
} CThings; 

typedef struct struct_CPlaces { 
    unsigned int d; 
    unsigned int e; 
    unsigned int f; 
} CPlaces ; 

void *ObjectFactory(ObjectType type) { 
    switch(type) { 
     case CPlaces_Object: { 
      return malloc(sizeof(CPlaces)); 
      break; 
     } 
     case CThings_Object: { 
      return malloc(sizeof(CThings)); 
      break; 
     } 
     default: { /* unknown type */ 
      return NULL; 
     } 
    } 
    return NULL; 
} 

int main(void) { 
    CPlaces *places = ObjectFactory(CPlaces_Object); 
    CThings *things = ObjectFactory(CThings_Object); 

    things->a = 2; 
    things->b = 8; 
    things->c = 4; 

    places->d = 5; 
    places->e = 7; 
    places->f = 3; 

    return 0; 
} 
+0

残念ながら、これはC++オブジェクトファクトリと全く同じではありません。私はオブジェクトがゴミ以外のものに初期化されることを期待しています。私は、varargsパラメータを取って、mallocと初期化をラップする "コンストラクタ"関数を持たせることをお勧めします。これらのコンストラクタは、varargsを取り出して、実際のコンストラクタを呼び出すためにオーバーロードすることができます。 –

+0

varargsを使いこなそう。型が本当に関連していて、それらのためのファクトリを作成することも合理的であるならば、共通の引数セットでそれらの型を構築できることを論理的に期待する必要があります。つまり、varargsを使用すると、どのコンストラクタが渡されるかを基本的に知る必要があります。つまり、作成する型を知る必要があるため、直接作成することもできます。 –

+0

@Michael Price、mallocの代わりにランダムなガベージコールcallocを必要としない場合、D –