ホームページ > バックエンド開発 > C++ > オブジェクト配列の初期化はパブリックのデフォルトコンストラクターなしで実現できますか?

オブジェクト配列の初期化はパブリックのデフォルトコンストラクターなしで実現できますか?

Patricia Arquette
リリース: 2024-12-20 09:41:10
オリジナル
200 人が閲覧しました

Can Object Array Initialization Be Achieved Without a Public Default Constructor?

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

次のコードを考えてみましょう。

#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(&amp;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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート