我不太了解原始指针,不幸的是我不允许使用<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];
}
感谢大家的时间!
答案 0 :(得分:3)
在你的构造函数中:
if (arr != nullptr) delete[] arr;
arr
是此类成员,此时尚未初始化。它是一个垃圾指针,可能不是nullptr
,它将尝试delete
垃圾指针。显然,这不会走得太远。
只需删除它即可。您的构造函数设置了size
和arr
,以及它所需要做的所有事情。您不必担心size
和arr
的现有值:您正在构建新对象。
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类中创建重载赋值运算符(如果它不存在)。