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

时间:2016-10-11 23:06:44

标签: c++ arrays pointers object memory-management

我不太了解原始指针,不幸的是我允许使用<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. Oops的手动内存分配来使其工作,我的意思是来自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];
}

感谢大家的时间!

2 个答案:

答案 0 :(得分:3)

在你的构造函数中:

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

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

只需删除它即可。您的构造函数设置了sizearr,以及它所需要做的所有事情。您不必担心sizearr的现有值:您正在构建新对象。

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

此功能仅在A is a POD时有效。相反,使用std::copy(),这将在所有情况下做正确的事情。如果您不能使用std::copy()而不允许使用std::vector,请手动编写for循环以复制此数据。

答案 1 :(得分:0)

没有必要在构造函数中检查arr是否为NULL,因为尚未为arr分配任何内容。

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

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

例如在你可以做的for循环中,arr [i] = arr_ [i],其中i是for循环中的索引。如果类A没有重载赋值运算符,则会发生成员变量的浅表副本。如果浅层副本不可接受,则应在A类中创建重载赋值运算符(如果它不存在)。