La società in cui lavoro sta inizializzando tutte le loro strutture di dati attraverso una funzione di inizializzazione in questo modo:
//the structure
typedef struct{
int a,b,c;
} Foo;
//the initialize function
InitializeFoo(Foo* const foo){
foo->a = x; //derived here based on other data
foo->b = y; //derived here based on other data
foo->c = z; //derived here based on other data
}
//initializing the structure
Foo foo;
InitializeFoo(&foo);
Ho avuto qualche spinta indietro nel tentativo di inizializzare le mie strutture in questo modo:
//the structure
typedef struct{
int a,b,c;
} Foo;
//the initialize function
Foo ConstructFoo(int a, int b, int c){
Foo foo;
foo.a = a; //part of parameter input (inputs derived outside of function)
foo.b = b; //part of parameter input (inputs derived outside of function)
foo.c = c; //part of parameter input (inputs derived outside of function)
return foo;
}
//initialize (or construct) the structure
Foo foo = ConstructFoo(x,y,z);
C'è un vantaggio l'uno rispetto all'altro?
Quale dovrei fare e come lo giustificherei come pratica migliore?
InitializeFoo()
è un costruttore. L'unica differenza rispetto a un costruttore C ++ è che il this
puntatore viene passato in modo esplicito anziché implicito. Il codice compilato di InitializeFoo()
e un C ++ corrispondente Foo::Foo()
è esattamente lo stesso.