在C++类中初始化C数组
我有一个包含私有 C 数组的 C++ 类,如下所示,
class DataObject {
private:
double* data_array_;
};
由于程序中未显示的其他部分的限制,我不能使用 a std::vector<double>,不能使用DataObject构造函数来初始化数组(初始化列表?),并且不想在堆上分配数组。因此,我必须在一个init()函数中初始化数组,该函数将数组元素的数量作为参数。到目前为止,我已经尝试了以下方法,但不幸的是它们似乎不起作用:
尝试 1:
void DataObject::init(unsigned int num_elements) {
data_array_[num_elements];
}
尝试 2:
void DataObject::init(unsigned int num_elements) {
data_array_ = double[num_elements];
}
因此,我想知道鉴于上述限制,是否还有另一种方法来初始化堆栈分配的私有 C 数组。
回答
我有一个包含私有 C 数组的 C++ 类,如下所示,
double* data_array_;
那不是数组。那是一个指针。因此,您的班级根本没有也不能“包含”一个数组。它只能指向包含在其他地方的数组(的元素)。
如果您想指向一个自动数组,唯一的方法是将(指针、引用或跨度)数组作为参数传递。例子:
void DataObject::init(double* data_array_, std::size_t num_elements) {
this->data_array_ = data_array_; this is becom
this->num_elements = num_elements;
}
void foo() {
constexpr std::size_t num_elements = 42;
double data_array_[num_elements];
DataObject example{};
example.init(data_array_, num_elements);
}
请注意,作为引用类型,您必须非常小心地使指向的数组保持活动状态,至少只要DataObject指向它的指向它的数组是活动的。否则指针将悬空。另请注意,该类看起来像是std::span动态范围的有限重新实现。使用它可能会更好。
如果您需要DataObject控制数组的生命周期(这会更安全,因为您可以避免悬空),并且数组的大小是在运行时确定的,那么动态分配是您唯一的选择(C++ 没有灵活的数组成员) C 会)。如果您不能使用std::vector,那么我建议使用相同数据结构的另一种实现。也就是说,我怀疑您可能错误地认为您不能使用std::vector.