如何将对象的动态数组传递给另一个类的参数化构造函数
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
这个垃圾指针。显然,这不会走得太远。
简单地删除这个。构造函数设置size
和arr
,这就是它需要做的全部工作。没有现有的size
和arr
值需要担心:您正在构造一个新对象。
memcpy(arr, arr_, sizeof(A) * size);
这只会在A
是一个POD时起作用。相反,使用std::copy()
,它将在所有情况下做正确的事情。如果您不能使用std::copy()
,并且不允许使用std::vector
,那么手动编写for循环来复制该数据。
不需要检查arr在构造函数中是否为NULL,因为还没有任何东西被赋值给arr。
memcpy不用于复制类,因为类通常具有作为函数指针存储的成员函数。你的memcpy语句不应该使用,因为它会覆盖在arr中创建的函数指针,当新的A[size]命令被执行时,它会使类B无法正常执行。
使用for循环遍历arr_并仅将a的数据成员从arr_复制到arr是可行的方法。
例如,在For循环中,您可以这样做,arr[i] = arr_[i],其中i是For循环中的索引。如果类A没有重载赋值操作符,则会发生成员变量的浅拷贝。如果不能接受浅拷贝,则在类a中创建一个不存在的重载赋值操作符。
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 修改函数中的指针(将另一个指针作为参数传递)
- 如何将一个类的函数作为另一个类的另一个函数的参数传递
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 如果需要转换,我可以在读取参数的同时将其移动到另一个参数吗?
- 如何在另一个函数中使用返回值作为参数?
- 如果模板参数是另一个模板的实例化,则键入特征测试
- 如何使用另一个类中的公共成员函数作为参数调用线程
- 如何将 lambda 函数作为参数发送到另一个函数
- 如何设置默认参数以防用户不输入另一个参数
- 将另一个参数传递给函子的库
- 一个C++默认参数可以用另一个参数初始化吗
- 从另一个参数引用的模板可变参数
- 如何根据c++中getopt中另一个参数的存在来解析其他参数
- 如何让每个线程传递另一个参数
- 从另一个参数的值设置默认参数值
- 使用参数的 getter 之一在 C++ 函数中设置另一个参数的值?
- Qt:用另一个参数创建一个新类
- 谷歌模拟,使用另一个参数的参数匹配器
- 非类型模板参数,其类型依赖于另一个参数