首页 >后端开发 >C++ >没有公共默认构造函数可以实现对象数组初始化吗?

没有公共默认构造函数可以实现对象数组初始化吗?

Patricia Arquette
Patricia Arquette原创
2024-12-20 09:41:10201浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn