C では、パブリックにアクセス可能なデフォルト コンストラクターを使用せずにオブジェクトの配列を初期化しようとすると、次のようなエラーが発生します。以下のコード スニペット:
class Car { private: Car(){}; // Default constructor hidden }; int main() { Car *cars = new Car[10]; // Error: Default constructor not accessible }
このエラーは、Car のプライベート デフォルト コンストラクターが実行できないために発生します。直接呼び出されます。ただし、デフォルトのコンストラクターを公開せずにそのような配列を作成できる解決策があります。
Placement-new は、作成を可能にする手法です。指定されたメモリ位置にオブジェクトを直接保存します。これを使用すると、デフォルトのコンストラクターのアクセシビリティ制限をバイパスできます。以下のコードは、その使用法を示しています。
class Car { public: Car(int no) : _no(no) {} }; int main() { void *raw_memory = operator new[](NUM_CARS * sizeof(Car)); // Allocate raw memory Car *cars = static_cast<Car *>(raw_memory); // Initialize objects at specific memory locations for (int i = 0; i < NUM_CARS; ++i) { new(&cars[i]) Car(i); } }
placement-new を利用すると、パブリックなデフォルト コンストラクターを必要とせずに、割り当てられたメモリ位置にオブジェクトを作成できます。
placement-new を使用すると、デフォルトのコンストラクターがプライベートであってもオブジェクトの配列を初期化できるようになります。この手法により柔軟性が高まり、カプセル化の原則を損なうことなく複雑なオブジェクト配列を作成できるようになります。
以上がパブリックのデフォルトコンストラクターを使用せずに C でオブジェクト配列を初期化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。