C++ c++;-复制构造函数、深度复制以及如何正确编写

C++ c++;-复制构造函数、深度复制以及如何正确编写,c++,constructor,C++,Constructor,我需要帮助,请我不知道这么多如何注册我的副本构造函数来执行深度复制 我的问题是我的复制构造函数是否正确注册,如果没有,我如何写下来,非常感谢 我的ArrayList.h: template<class T> class ArrayList{ private: T* storage;// T pointer array int size;// size of array public: ArrayList();//constructor ArrayList(const &

我需要帮助,请我不知道这么多如何注册我的副本构造函数来执行深度复制

我的问题是我的复制构造函数是否正确注册,如果没有,我如何写下来,非常感谢

我的ArrayList.h:

template<class T> 
class ArrayList{
private: 
T* storage;// T pointer array 
int size;// size of array

public:
ArrayList();//constructor
ArrayList(const &ArrayList);//copy constructor
};

template<class T>//constructor
ArrayList<T>::ArrayList(){
size = 0;// size of array in start
}//end ArrayList

template<class T>//copy constructor
ArrayList<T>::ArrayList(const &ArrayList){
T* _storage = T* storage;
int _size = size;
}

template<class T>//destructor
ArrayList<T>::~ArrayList(){
delete[]storage;
}//end ~ArrayList
模板
类数组列表{
私人:
T*存储;//T指针数组
int size;//数组的大小
公众:
ArrayList();//构造函数
ArrayList(const&ArrayList);//复制构造函数
};
模板//构造函数
ArrayList::ArrayList(){
size=0;//开始时数组的大小
}//末端阵列列表
模板//复制构造函数
ArrayList::ArrayList(常量和ArrayList){
T*_存储=T*存储;
int _size=大小;
}
模板//析构函数
ArrayList::~ArrayList(){
删除[]存储;
}//end~ArrayList

谢谢

不,这是不对的。现在,您正在执行浅层复制,即仅复制指针(默认的复制构造函数无论如何都会这样做),因此,当副本和原始副本超出范围时,将有两个析构函数尝试取消分配相同的内存和bam

您需要在复制构造函数中分配内存,复制元素,然后更改指针以指向新分配的内存,如

template<class T>//copy constructor
ArrayList<T>::ArrayList(const ArrayList&){
    T* copy_storage = new T[size];

    for(std::size_t i = 0; i < size; ++i)
        copy_storage[i] = storage[i];

    storage = copy_storage;
}
模板//复制构造函数
ArrayList::ArrayList(常量ArrayList&){
T*copy_storage=newt[size];
对于(标准::大小\u t i=0;i

我想这是一个练习。如果没有,只需使用
std::vector
,一切都会自动处理。

tahnk's。但是为什么我得到错误2错误C4430:缺少类型说明符-假定为int。注意:C++不支持缺省INT:\Base\Deave\AlrayList.h 33 1Template@david参考号
&
必须在类型之后,即
常量数组列表&
(答案中已更正),请确保相应地更改代码。现在你定义了析构函数,但没有在类中声明它,还要确保你声明了析构函数。谢谢,我明白了。现在我得到了这个错误:错误1错误LNK1104:无法打开文件“c:\Projects\Template\Release\Template.exe”c:\Projects\Template\LINKTemplate@david只需将声明和定义放在单个头文件中,换句话说,不要将定义放在单独的.cpp中。对于模板,您不能将它们分开(从技术上讲,如果您显式地实例化它们,您可以将它们分开,但这是另一回事)。有关更多详细信息,请参阅。如果您已经有了这样的程序,请清理项目并重新编译,“我不使用Windows,因此在此无法为您提供更多帮助”。@david在Windows上重建时,如果程序的实例仍在运行,则会发生这种情况。