gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:34:13 24 4
gpt4 key购买 nike

我不太了解原始指针,不幸的是我不允许使用 <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);
}

如何在不弄乱内存的情况下传递这个参数?上面的代码不能正常工作,所以我想听听一些提示。虽然我的问题似乎已经得到解答,但我没能通过 google 搜索到解决方案,对此我深表歉意。

我不允许使用任何保险箱 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,这将尝试删除 垃圾指针。显然,这不会走得太远。

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

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

这仅在 A is a POD 时有效.相反,使用 std::copy(),它在所有情况下都会做正确的事情。如果您不能使用 std::copy() 并且不允许使用 std::vector,那么请手动编写一个 for 循环来复制此数据.

关于c++ - 如何将对象的动态数组传递给另一个类的参数化构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39988124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com