Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;使用动态分配的数组复制类的构造函数 刚刚开始C++(几天),我来C背景。_C++_Arrays_Copy Constructor_Dynamic Allocation - Fatal编程技术网

C++;使用动态分配的数组复制类的构造函数 刚刚开始C++(几天),我来C背景。

C++;使用动态分配的数组复制类的构造函数 刚刚开始C++(几天),我来C背景。,c++,arrays,copy-constructor,dynamic-allocation,C++,Arrays,Copy Constructor,Dynamic Allocation,我有一个类,主要包含指向int数组的指针,代码如下: class Array { private: int * _arr; int _size; public: Array(); Array(int size); Array(const Array& obj); // copy constructor ~Array(); void readInValues(); void mult(int num); void a

我有一个类,主要包含指向int数组的指针,代码如下:

class Array
{
private:
    int * _arr;
    int _size;
public:
    Array();
    Array(int size);
    Array(const Array& obj);  // copy constructor
    ~Array();
    void readInValues();
    void mult(int num);
    void add(int num);
    void printArray();
};
_arr是指向int数组的指针,当使用copy构造函数创建新实例时,我会在堆上创建一个新的int数组(我想)。在复制构造函数中:

Array::Array( const Array & obj )
{
    _arr = new int[_size];

    for(int i=0;i<_size;i++)
        *_arr[i] = *obj._arr[i];
}
Array::Array(常量数组和obj)
{
_arr=新整数[_大小];

for(int i=0;i
\u size
没有初始值,因为在使用它之前,您没有将其作为参数传递或在其他任何地方初始化

另外,不要做
*\u arr[i]=*obj.\u arr[i];

它没有意义,因为
arr[i]
本身意味着
*(arr+i)

做:


\u size
没有初始值,因为在使用它之前,您既没有将其作为参数传递,也没有在其他任何地方初始化

另外,不要做
*\u arr[i]=*obj.\u arr[i];

它没有意义,因为
arr[i]
本身意味着
*(arr+i)

做:


当你这么做的时候,你应该会没事的

Array::Array( const Array & obj ):
    _size(obj._size) 
{
    _arr = new int[_size];

    for(int i=0;i<_size;i++)
        _arr[i] = obj._arr[i];
}
Array::Array(常量数组和obj):
_尺寸(对象尺寸)
{
_arr=新整数[_大小];

对于(inti=0;i当你这样做时,你应该很好

Array::Array( const Array & obj ):
    _size(obj._size) 
{
    _arr = new int[_size];

    for(int i=0;i<_size;i++)
        _arr[i] = obj._arr[i];
}
Array::Array(常量数组和obj):
_尺寸(对象尺寸)
{
_arr=新整数[_大小];
对于(int i=0;i

具体来说,请注意初始值设定项列表的使用。其他值得一提的事项:

  • 不要使用带有前导下划线的标识符。除了让代码成为阅读的难点之外,您还可以很快发现自己正在使用由实现保留的标识符。这里不是这样,但我敢打赌这不是故意的

  • 您还需要一个赋值运算符来完成这个任务。谢天谢地,一个像样的复制构造函数使得这个任务变得微不足道

  • 这就是为什么,在设计决定中,我们都会大哭和咬牙切齿,过去的几年来,全能的C++标准委员会已经选择了祝福我们。如果你这么做是为了学习,那么你最终会学到的是,一旦你接受标准库和它的所有罪过,你是多么难得。措施

    如果这是一个学习练习,那么请忽略上面的第(3)项。对于第(2)项,您可以使用现在您有了一个合理的副本:

    Array& Array::operator =(Array obj) // value-param intentional
    {
        std::swap(_arr, obj._arr);
        std::swap(_size, obj._size);
        return *this;
    }
    
    祝你好运。

    这是:

    Array::Array( const Array & obj )
    {
        _arr = new int[_size];
    
        for(int i=0;i<_size;i++)
            *_arr[i] = *obj._arr[i];
    }
    
    具体来说,请注意初始值设定项列表的使用。其他值得一提的事项:

  • 不要使用带有前导下划线的标识符。除了让代码成为阅读的难点之外,您还可以很快发现自己正在使用由实现保留的标识符。这里不是这样,但我敢打赌这不是故意的

  • 您还需要一个赋值运算符来完成这个任务。谢天谢地,一个像样的复制构造函数使得这个任务变得微不足道

  • 这就是为什么,在设计决定中,我们都会大哭和咬牙切齿,过去的几年来,全能的C++标准委员会已经选择了祝福我们。如果你这么做是为了学习,那么你最终会学到的是,一旦你接受标准库和它的所有罪过,你是多么难得。措施

    如果这是一个学习练习,那么请忽略上面的第(3)项。对于第(2)项,您可以使用现在您有了一个合理的副本:

    Array& Array::operator =(Array obj) // value-param intentional
    {
        std::swap(_arr, obj._arr);
        std::swap(_size, obj._size);
        return *this;
    }
    

    祝你好运。

    \u要复制的原语类型的大小实际上是一个正确的语句,但你没有指定完整的句子。
    当您不声明副本构造函数时,默认实现如下

    Array::Array( const Array & obj )
    {
        this._size = obj._size;
        this._arr = obj._arr;
    }
    
    这是您不想要的,因为复制的对象将共享\u arr变量。
    但是,由于您已经实现了复制构造函数,因此需要完全实现它。 在您的情况下,您没有使用
    \u size
    的值。因此它将是未定义的


    编译失败是由于行
    *\u arr[i]=*obj.\u arr[i]
    造成的。您正在使用*使用非法间接寻址。只需使用
    \u arr[i]=obj.\u arr[i]
    复制它。

    \u正在复制的原语类型的大小实际上是一个true语句,但您没有指定完整的句子。
    当您不声明副本构造函数时,默认实现如下

    Array::Array( const Array & obj )
    {
        this._size = obj._size;
        this._arr = obj._arr;
    }
    
    这是您不想要的,因为复制的对象将共享\u arr变量。
    但是,由于您已经实现了复制构造函数,因此需要完全实现它。 在您的情况下,您没有使用
    \u size
    的值。因此它将是未定义的


    编译失败是由于行
    *\u arr[i]=*obj.\u arr[i];
    造成的。您正在使用*使用非法间接寻址。只需使用
    \u arr[i]=obj.\u arr[i];
    复制它。

    这是我的解决方案。也许会有所帮助

    Array.h
    
    #pragma once
    class Array {
    
    public:
    
        Array();
        Array(int size);
        Array(const Array& src);
        Array operator=(const Array& rhs);
        ~Array();
    
        void readInValues();
        void mult(int num);
        void add(int num);
        void printArray();
    
    private:
        int *_arr;
        int _size;
    
    };
    
    我添加了赋值操作符来引用三个规则,它是Array.cpp

    #include "Array.h"
    
    Array::Array()
        :_size(10) {
    
        _arr = new int[_size];
    }
    
    Array::Array(int size)
        : _size(size) {
    
        _arr = new int[_size];
    }
    
    Array::Array(const Array& src) {
        _size = src._size;
        _arr = new int[_size];
    
        for (int i = 0; i < _size; i++) {
            _arr[i] = src._arr[i];
        }
    }
    
    Array Array::operator=(const Array& rhs) {
        if (this == &rhs) {
            return (*this);
        }
    
        delete[] _arr;
    
        _size = rhs._size;
        _arr = new int[_size];
    
        for (int i = 0; i < _size; i++) {
            _arr[i] = rhs._arr[i];
        }
    }
    
    Array::~Array() {
        delete[] _arr;
    }
    
    #包括“Array.h”
    数组::数组()
    :_尺寸(10){
    _arr=新整数[_大小];
    }
    数组::数组(整数大小)
    :_尺寸(尺寸){
    _arr=新整数[_大小];
    }
    数组::数组(常量数组和src){
    _尺寸=src.\u尺寸;
    _arr=新整数[_大小];
    对于(int i=0;i<\u size;i++){
    _arr[i]=src.u arr[i];
    }
    }
    数组::运算符=(常量数组和rhs){
    如果(此==&rhs){
    返回(*本条);
    }
    删除[]_arr;
    _尺寸=rhs.\u尺寸;
    _arr=新整数[_大小];
    对于(int i=0;i<\u size;i++){
    _arr[i]=rhs._arr[i];
    }
    }
    数组::~Array(){
    删除[]_arr;
    }
    
    这是我的解决方案。也许会有帮助

    Array.h
    
    #pragma once
    class Array {
    
    public:
    
        Array();
        Array(int size);
        Array(const Array& src);
        Array operator=(const Array& rhs);
        ~Array();
    
        void readInValues();
        void mult(int num);
        void add(int num);
        void printArray();
    
    private:
        int *_arr;
        int _size;
    
    };
    
    我添加了赋值操作符来引用三个规则,它是Array.cpp

    #include "Array.h"
    
    Array::Array()
        :_size(10) {
    
        _arr = new int[_size];
    }
    
    Array::Array(int size)
        : _size(size) {
    
        _arr = new int[_size];
    }
    
    Array::Array(const Array& src) {
        _size = src._size;
        _arr = new int[_size];
    
        for (int i = 0; i < _size; i++) {
            _arr[i] = src._arr[i];
        }
    }
    
    Array Array::operator=(const Array& rhs) {
        if (this == &rhs) {
            return (*this);
        }
    
        delete[] _arr;
    
        _size = rhs._size;
        _arr = new int[_size];
    
        for (int i = 0; i < _size; i++) {
            _arr[i] = rhs._arr[i];
        }
    }
    
    Array::~Array() {
        delete[] _arr;
    }
    
    #包括“Array.h”
    数组::数组()
    :_尺寸(10){
    _arr=新整数[_大小];
    }
    数组::数组(整数大小)
    :_尺寸(尺寸){
    _arr=新整数[_大小];
    }
    数组::数组(常量数组和src){
    _尺寸=src.\u尺寸;
    _arr=新整数[\u大小]