私はこれをよく見ます:
Monkey* test = malloc(sizeof(Monkey));
Monkey_New(test);
init 関数がポインターを返すようにした方がすっきりしないでしょうか?
Monkey* test = Monkey_New();
最初の方法で頻繁に行われるのはなぜですか?
私はこれをよく見ます:
Monkey* test = malloc(sizeof(Monkey));
Monkey_New(test);
init 関数がポインターを返すようにした方がすっきりしないでしょうか?
Monkey* test = Monkey_New();
最初の方法で頻繁に行われるのはなぜですか?
2つのデザインは機能的に非常に異なります。あなたが求めているものは、呼び出し元に割り当ての負担をかけます。malloc
これには、オブジェクトが呼び出し元より長く存続する必要がない場合、動的ストレージ ( ) を回避できるという大きな利点があります。自動変数に格納できます。これは、init 関数がそれ以上のリソースを取得する必要がないと仮定すると、呼び出し元がエラーをチェックする必要がない、エラーのない API を持つことができることも意味します。一方、構造体の定義 (少なくともサイズ) を呼び出しモジュールに公開する必要があります。つまり、ライブラリ コードを更新してより大きなサイズのオブジェクトを使用する場合は、呼び出し元を再コンパイルする必要があります。したがって、長期的に安定した ABI を持つことを目的とした共有ライブラリにはマイナスになる可能性があります。
あなたが指摘した代替設計では、ストレージを取得する負担は呼び出し先 (ライブラリ関数) にあり、動的ストレージ ( malloc
) を使用する必要があります。これはより抽象的でクリーンです。
それはすべて、開発者が使用する命名規則に依存します。これを考慮してください:
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Default_Constructors
c++ および c の場合、new を使用するように指示し、初期化を支援するパラメーターを受け取り、初期化された値を返します。昔はそうではありませんでした。当時は野生の世界だったからです。良識のために、Monkey_New(); を使用してください。