デフォルト コンストラクターを使用しないオブジェクト配列の初期化
次のコードを考えてみましょう。
#include <iostream> class Car { private: Car(){}; int _no; public: Car(int no) { _no=no; } void printNo() { std::cout<<_no<<std::endl; } }; void printCarNumbers(Car *cars, int length) { for(int i = 0; i<length;i++) std::cout<<cars[i].printNo(); } int main() { int userInput = 10; Car *mycars = new Car[userInput]; for(int i =0;i < userInput;i++) mycars[i]=new Car[i+1]; printCarNumbers(mycars,userInput); return 0; }
このコードは、車の配列ですが、コンパイルすると、Car() コンストラクターがプライベートであることを示すエラーが発生します。問題は、Car() コンストラクターをパブリックにせずに初期化を実行できるかということです。
解決策
この問題に対処するには、placement-new を次のように利用できます。 :
class Car { int _no; public: Car(int no) : _no(no) { } }; int main() { void *raw_memory = operator new[](NUM_CARS * sizeof(Car)); Car *ptr = static_cast<Car *>(raw_memory); for (int i = 0; i < NUM_CARS; ++i) { new(&ptr[i]) Car(i); } // destruct in inverse order for (int i = NUM_CARS - 1; i >= 0; --i) { ptr[i].~Car(); } operator delete[](raw_memory); return 0; }
Placement-new を使用すると、メモリを割り当て、特定の場所にオブジェクトを構築できます。この場合、raw_memory が割り当てられ、その後、placement-new を使用して、ptr が指すアドレスに Car オブジェクトを構築します。
placement-new を活用することで、車の配列の初期化を実現できます。 Car() コンストラクターのプライバシーを尊重
以上がオブジェクト配列の初期化はパブリックのデフォルトコンストラクターなしで実現できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。