私が働いている会社は、次のような初期化関数を使用して、すべてのデータ構造を初期化しています。
//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);
私はこのような構造体を初期化しようとするいくつかのプッシュバックを得ました:
//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);
一方に他方よりも利点はありますか?
どちらを行うべきか、そしてそれをより良い方法としてどのように正当化するのか?
InitializeFoo()
はコンストラクターです。C ++コンストラクターとの唯一の違いは、this
ポインターが暗黙的にではなく明示的に渡されることです。のコンパイル済みコードInitializeFoo()
と対応するC ++ Foo::Foo()
はまったく同じです。