如何复制动态分配的对象(具有一个类的 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)。

【讨论】:

谢谢,但是如果我有一个动态数组并且我必须从中复制整个数据列表,那我就卡住了。 @QaziZainullah std::vector&lt;ramish&gt; a; std::vector&lt;ramish&gt; b = a; 真的就这么简单。如果你想走 c-array 路线,你需要“手动”复制,一旦你有一个工作副本构造函数(或memcpy

以上是关于如何复制动态分配的对象(具有一个类的 const 成员)的主要内容,如果未能解决你的问题,请参考以下文章

具有引用语义的 const 对象

类和动态内存分配

第十二章 类和动态内存分配

如何允许移动构造并禁止分配和复制类的构造

具有抽象类的 C++11 对象组合

类的 C++ 动态内存分配