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

C++ 如何将对象的动态数组传递给另一个类的参数化构造函数?,c++,arrays,pointers,object,memory-management,C++,Arrays,Pointers,Object,Memory Management,我不太了解原始指针,不幸的是,不允许我使用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

我不太了解原始指针,不幸的是,不允许我使用
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];
}
B::B(整数大小,常数A*arr){
大小=大小;
arr=新的A[尺寸];
对于(int i=0;i
谢谢大家的时间

在构造函数中:

if (arr != nullptr) delete[] arr;
arr
是此时未初始化的类成员。它是一个垃圾指针,可能不是
nullptr
,这将尝试
删除垃圾指针。显然,这不会走得很远

简单地删除这个。构造函数设置
size
arr
,这就是它所需要做的一切。没有需要担心的
size
arr
的现有值:您正在构建一个新对象

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

这仅在
A
时有效。相反,使用
std::copy()
,这在所有情况下都是正确的。如果除了不允许使用
std::vector
之外,还不能使用
std::copy()
,则手动编写一个for循环来复制此数据。

无需检查构造函数中的arr是否为NULL,因为尚未为arr分配任何内容

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

使用for循环迭代arr_,并仅将a的数据成员从arr_复制到arr是一种方法


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

您需要提供完整的测试用例。请参见此处:您提供的代码中没有足够的信息来告诉您错误所在。是否可以使用
std:array
if(arr!=nullptr)delete[]arr不太可能是您在构造函数中想要的内容。事实上,这是错误的。使用
memcpy
是错误的,除非你知道
A
是可复制的。“我需要弄清楚如何使用C中的手动内存分配来工作。”听到这个消息我很难过。注意,C中既不存在
new
也不存在
delete
;因此,阅读头文件的人对参数的含义有了一个概念,值得注意的是,这仍然不是很好,因为它默认构造了一个,然后复制赋值,但是对于OP所处的级别来说已经足够了。