繁体   English   中英

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

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

我不明白原始指针相当不错,不幸的是我不能使用<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::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类中创建重载的赋值运算符(如果不存在)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM