デフォルト コンストラクターを使用しないオブジェクト配列の初期化
オブジェクト配列はプログラミングでよく使用されますが、デフォルト コンストラクターのないクラスでオブジェクト配列を初期化すると問題が発生する可能性があります。 。次のコードを考えてみましょう。
class Car { private: Car(){}; // Private default constructor int _no; public: Car(int no) { _no = no; } };
このクラス内では、デフォルトのコンストラクター (Car()) はプライベートです。これは、引数を指定しないと Car 型のオブジェクトを作成できないことを意味します。ただし、Car オブジェクトの配列を初期化するときに、コンパイラーは各要素のデフォルトのコンストラクターを呼び出そうとし、エラーが発生します:
cartest.cpp:5: error: ‘Car::Car()’ is private cartest.cpp:21: error: within this context
Placement-New を使用したソリューション
この問題を解決するには、place-new を使用できます。 Placement-new を使用すると、オブジェクトのコンストラクターを呼び出すことなく、メモリを割り当て、そのメモリ位置にオブジェクトを直接構築できます。実装方法は次のとおりです。
int main() { void *raw_memory = operator new[](NUM_CARS * sizeof(Car)); // Allocate raw memory Car *ptr = static_cast<Car *>(raw_memory); // Cast to a pointer to Car for (int i = 0; i < NUM_CARS; ++i) { new(&ptr[i]) Car(i); // Call placement-new to construct Car objects in-place } }
placement-new を使用すると、デフォルトのコンストラクターを明示的に呼び出さずにオブジェクト配列を初期化できます。オブジェクトは作成され、割り当てられたメモリに直接配置されます。
デフォルト コンストラクターを回避する利点
Scott Meyers の「More Effects C C」の項目 4 で述べたように、不要なデフォルト コンストラクターを回避すると、プログラムの正確性と保守性が向上します。デフォルトのコンストラクターはクラス設計に曖昧さをもたらすことが多く、クラスの不変条件を強制することが困難になる可能性があります。コンストラクターを明示的に定義することで、プログラマは、そのクラスのオブジェクトが特定の引数セットでのみ作成できることを主張し、より優れた制御と明確性を確保します。
以上がデフォルトのコンストラクターを使用せずにオブジェクト配列を初期化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。