A empresa em que trabalho está inicializando todas as estruturas de dados por meio de uma função de inicialização da seguinte maneira:
//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);
Eu recebi um empurrão para trás tentando inicializar minhas estruturas assim:
//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);
Existe uma vantagem para um sobre o outro?
Qual deles devo fazer e como justificaria isso como uma prática melhor?
InitializeFoo()
é um construtor. A única diferença de um construtor C ++ é que o this
ponteiro é passado explicitamente e não implicitamente. O código compilado InitializeFoo()
e um C ++ correspondente Foo::Foo()
são exatamente iguais.