ホームページ >バックエンド開発 >C++ >デフォルトのコンストラクターを使用せずにオブジェクト配列を初期化するにはどうすればよいですか?

デフォルトのコンストラクターを使用せずにオブジェクト配列を初期化するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-27 06:15:12822ブラウズ

How to Initialize Object Arrays Without a Default Constructor?

デフォルト コンストラクターを使用しないオブジェクト配列の初期化

オブジェクト配列はプログラミングでよく使用されますが、デフォルト コンストラクターのないクラスでオブジェクト配列を初期化すると問題が発生する可能性があります。 。次のコードを考えてみましょう。

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(&amp;ptr[i]) Car(i);  // Call placement-new to construct Car objects in-place
  }
}

placement-new を使用すると、デフォルトのコンストラクターを明示的に呼び出さずにオブジェクト配列を初期化できます。オブジェクトは作成され、割り当てられたメモリに直接配置されます。

デフォルト コンストラクターを回避する利点

Scott Meyers の「More Effects C C」の項目 4 で述べたように、不要なデフォルト コンストラクターを回避すると、プログラムの正確性と保守性が向上します。デフォルトのコンストラクターはクラス設計に曖昧さをもたらすことが多く、クラスの不変条件を強制することが困難になる可能性があります。コンストラクターを明示的に定義することで、プログラマは、そのクラスのオブジェクトが特定の引数セットでのみ作成できることを主張し、より優れた制御と明確性を確保します。

以上がデフォルトのコンストラクターを使用せずにオブジェクト配列を初期化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。