Фабрика объектов в C вместо C ++ - PullRequest
0 голосов
/ 20 октября 2011

Я конвертирую кучу кода из 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;
}

Ответы [ 2 ]

5 голосов
/ 20 октября 2011

Как насчет использования malloc:

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

Нет необходимости в break, если вы уже вернетесь. Если хотите, можете добавить инициализацию перед возвратом.

Вызывающий должен знать фактический тип, чтобы он мог привести указатель обратно к правильному типу. Это, вероятно, будет означать дублирование оператора switch на сайте вызывающего абонента.

0 голосов
/ 20 октября 2011
#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...