如何将对象的动态数组传递给另一个类的参数化构造函数

How do I pass a dynamic array of objects to a parameterized constructor of another class?

本文关键字:另一个 参数 构造函数 对象 动态 数组      更新时间:2023-10-16

我不太了解原始指针,不幸的是我允许使用<vector> s,所以我不知道如何编写一个参数化的构造函数的类,有另一个类对象的数组作为其属性。

class A{
    ...
};
class B{
    int size;
    A *arr;
    ...
    B(int, const A *); // am I declaring this right?
}
...
B::B(int size_, const A *arr_) { // this is the constructor I'm trying to write
    size = size_;
    if (arr != nullptr) delete[] arr;
    arr = new A[size];
    memcpy(arr, arr_, sizeof(A) * size);
}

如何传递这个参数而不弄乱内存?上面的代码不能正常工作,所以我想听听一些提示。虽然我的问题似乎已经有人回答了,但我没有设法谷歌解决方案,在这种情况下,我道歉。

我不允许使用任何安全的std::材料。我需要弄清楚如何使用C中的手动内存分配使其工作。哎呀,我的意思是c++,谢谢您指出这一点。

这是目前为止为我工作的构造函数:

B::B(int size_, const A *arr_) {
    size = size_;
    arr = new A[size_];
    for (int i = 0; i < size; i++) arr[i] = arr_[i];
}

感谢大家的时间!

构造函数:

if (arr != nullptr) delete[] arr;

arr是一个尚未初始化的类成员。它是一个垃圾指针,可能不是nullptr,这将尝试delete这个垃圾指针。显然,这不会走得太远。

简单地删除这个。构造函数设置sizearr,这就是它需要做的全部工作。没有现有的sizearr值需要担心:您正在构造一个新对象。

memcpy(arr, arr_, sizeof(A) * size);

这只会在A是一个POD时起作用。相反,使用std::copy(),它将在所有情况下做正确的事情。如果您不能使用std::copy(),并且不允许使用std::vector,那么手动编写for循环来复制该数据。

不需要检查arr在构造函数中是否为NULL,因为还没有任何东西被赋值给arr。

memcpy不用于复制类,因为类通常具有作为函数指针存储的成员函数。你的memcpy语句不应该使用,因为它会覆盖在arr中创建的函数指针,当新的A[size]命令被执行时,它会使类B无法正常执行。

使用for循环遍历arr_并仅将a的数据成员从arr_复制到arr是可行的方法。

例如,在For循环中,您可以这样做,arr[i] = arr_[i],其中i是For循环中的索引。如果类A没有重载赋值操作符,则会发生成员变量的浅拷贝。如果不能接受浅拷贝,则在类a中创建一个不存在的重载赋值操作符。