如何复制动态分配的对象(具有一个类的 const 成员)
Posted
技术标签:
【中文标题】如何复制动态分配的对象(具有一个类的 const 成员)【英文标题】:How to copy a dynamically allocated object (with having one const member of a class) 【发布时间】:2021-07-21 18:28:33 【问题描述】:我正在尝试创建一个函数,用户可以在其中添加一个数据条目,因此该数组会动态地将其大小增加 1 并允许用户输入数据。
逻辑:
-
通过引用函数传递当前大小和数组指针
在函数中创建一个新的指针数组(动态分配),并将其大小增加 1。
将传入数组中的所有数据复制到新建的数组中
删除分配给参数指针的内存
将参数指针指向新的指针数组。
问题:我在类中有一个 const int 成员,按照上面的算法,当我尝试将内容复制到新指针时,很明显 id 不会被复制到 const 成员。 我有一种预感,我可以在这里使用带有初始化列表的复制构造函数,并在复制构造函数的帮助下初始化函数的新数组。
我需要知道如何使用复制构造函数复制动态分配的对象数组,此外,如果对象有一些 const 成员。
提前致谢。
类头:
#include <iostream>
#include <stdlib.h>
using namespace std;
class ramish
private:
const int id;
public:
void print()
cout << "ID = " << id;
ramish():id(rand()%100+1)
//ramish(ramish *& object)
//
//
;
功能和驱动程序:
int main()
int size = 4;
ramish* object = new ramish[size];
copypointer(object, size);
void copypointer(ramish*& object, int size)
ramish *newobject = new ramish[size + 1];
for (int i = 0; i < size; i++)
newobject[i]=object[i];//going to give error here due to const member
delete[]object;
//take inps from user for newobject[size]
object = newobject;
newobject = NULL;
【问题讨论】:
“我可以在这里使用带有初始化列表的复制构造函数”你试过吗?简单的解决方案是使成员不是const
。无论如何,没有办法从外部修改它,因为它已经是private
。
是的,但我在复制指针数组和复制构造函数时遇到了问题
我们可以在声明对象时使用初始化列表为 const 成员赋值,就像上面的例子一样,我正在这样做。比我认为必须有一种方法可以在复制构造函数将参数指针复制到 newpointer 时循环参数指针索引。
不确定您的意思。 object = newobject;
正在复制一个指针,与复制构造函数无关。如果您在代码中遇到编译器错误问题,请在问题中包含编译器错误。
我发现一个有用的经验法则是,“当你认为你想要一个 const 成员时,再想一想”。
【参考方案1】:
我可以在这里使用带有初始化列表的复制构造函数
是的,你可以:
class ramish
private:
const int id;
public:
void print()
cout << "ID = " << id << "\n";
ramish():id(rand()%100+1)
ramish(const ramish& other) : id(other.id)
;
int main()
ramish a;
ramish b = a;
a.print();
b.print();
Output:
ID = 84
ID = 84
尽管您应该考虑从成员中删除const
。你为什么选择const
?以至于无法修改。但它是私有的,即使它不是const
,也无法从类外部修改它。然后你可以依赖编译器生成的复制构造函数(example)。
【讨论】:
谢谢,但是如果我有一个动态数组并且我必须从中复制整个数据列表,那我就卡住了。 @QaziZainullahstd::vector<ramish> a; std::vector<ramish> b = a;
真的就这么简单。如果你想走 c-array 路线,你需要“手动”复制,一旦你有一个工作副本构造函数(或memcpy
)以上是关于如何复制动态分配的对象(具有一个类的 const 成员)的主要内容,如果未能解决你的问题,请参考以下文章