我可以从前面提到的实例变量中获取初始化列表中数组的堆内存吗?

Can I get memory on a heap for an array in an initialization list from prior mentioned instance variables?

我正在尝试在我的自定义构造函数中创建对象时在堆上为数组分配内存。数组的大小由先前初始化的实例变量决定。为了清楚起见,这是我的代码。

struct PNG {

    PNG() = delete;
    PNG(unsigned width, unsigned height):
        d_width(width),
        d_height(height),
        d_imageData(new unsigned int [d_width * d_height])
    {
    };

    PNG(PNG const &);

    PNG & operator = (PNG & other);

    friend std::ostream & operator << (std::ostream & os, PNG & png);

    unsigned d_width;
    unsigned d_height;
    unsigned d_imageData; // unsigned d_imageData []; has the same issue
};

这段代码给出了错误:

error: cannot initialize a member subobject of type 'unsigned int' with an rvalue of
      type 'unsigned int *'
        d_imageData(new unsigned int [d_width * d_height])

我对两件事感到困惑:

  1. 按照我的看法,数组会请求内存,因此也会 是一个容器,因此是 lvalue 而不是 rvalue 有存储空间。
  2. 变量 d_widthd_height 在初始化列表中提及后是否可以访问?

我看到它是这样做的,但想尝试初始化列表。现在,我正在通过玩代码来学习新东西。这是唯一可能的方法吗?

PNG(unsigned int width, unsigned int height) {
    width_ = width;
    height_ = height;
    imageData_ = new HSLAPixel[width * height];
  }

This question 接近但它使用 std::initializer_list 我不想使用它,我也不需要接受的答案中建议的模板。更重要的是,数组值将在稍后填写,而不是在对象构造时填写。

你的构造函数没问题。但是由于你是用new[]d_imageData分配内存,你需要声明d_imageData为指针类型,而不是整数类型,eg:

unsigned int *d_imageData; // <-- notice the *

(不要忘记包含调用 delete[] d_imageData; 的析构函数 - 请参阅 Rule of 3/5/0)。

是的,您可以在构造函数的成员初始值设定项列表中对 new[] 的调用中使用 d_widthd_height,因为它们是在 d_imageData 之前声明的PNG 的声明,因此在 d_imageData.

之前初始化