【问题标题】:Copy constructor producing incorrect copy of old array复制构造函数产生不正确的旧数组副本
【发布时间】:2023-03-26 06:15:01
【问题描述】:

我有一个类vector210,我正在尝试创建一个复制构造函数,如下面的示例代码中所述(仅完整代码的一部分)。

class vector210 {
    public:
    int arraySize;
    int values[1]; 

vector210(int array[], int arraySize_){
arraySize = arraySize_;
for(int i = 0;i !=arraySize_;i++){
    values[i] = array[i];
    }
}

vector210(const vector210 &p){
    int values [p.arraySize];

    for(int i=0;i<p.arraySize;i++){
    values[i] =  p.values[i];            
          };        
    arraySize = p.arraySize;

};


void print(){
for(int i =0;i <arraySize;i++){
    cout << values[i]  << endl;
    }

if (arraySize ==0){
    cout << "Vector is empty." << endl;
}
};

当我在main 中运行代码时:

#include "CST210vector.h"
#include <iostream>
using namespace std;
int main() {
    int v[5] = {1,2,3,4,5} ;
    vector210 test(v, sizeof(v)/sizeof(*v));

    cout << "Array to copy " << endl;
    test.print();
    cout << "Copied array values:"<< endl;
    vector210 testnew = test;
    testnew.print();
    cout << " " << endl;
    cout << testnew.size() << endl; 
}

我接收到终端的输出:

Array to copy
1
2
3
4
5
Copied array values:
5
4198189
0
1
2

因此,在调用复制构造函数时构造的数组似乎与旧版本的 vector210 对象中的数组大不相同,但我不确定这是如何发生的。有没有人知道这个错误是如何发生的?我希望我的复制构造函数生成原始数组的精确副本。

【问题讨论】:

  • 为什么是values[1]?你的向量应该只包含一个元素吗?
  • 您有一个包含 1 个元素的数组。是什么让你认为你可以为它分配任意数量的元素?
  • 刚开始学c++,是不是:int values[]更好?
  • 在您的复制构造函数中,int values [p.arraySize]; 不会调整 values 成员变量的大小,它声明了新的局部变量来隐藏成员变量。
  • 如果您刚刚开始,请使用std::vector 而不是重新发明它。如果您将其作为练习进行,并且尚未涉及动态内存分配,那么您还没有准备好实现它。

标签: c++ arrays copy-constructor


【解决方案1】:

你的方法是错误的vector210::values 应该是一个指针,你应该为它分配内存。 C++ 没有动态数组。你的类和构造函数应该是这样的

class vector210 {
public:
    int arraySize;
    int* values; // pointer!

    vector210(const int* array, int arraySize_) : 
            arraySize(arraySize_),
            values(new int[arraySize_]) { // allocate memory
        for (int i = 0; i != arraySize_; i++)
            values[i] = array[i];
    }
    ...
}

现在你的复制构造函数应该是类似的,它使用 new 分配内存。

【讨论】:

    【解决方案2】:

    您正在使用动态数组。编译器应该抱怨它

    我会建议使用指针作为 int a [] 变为 int * a,以下对我来说很好

    class vector210 {
        public:
        int arraySize;
        int *values;
    
    vector210(const vector210 &p){
        values = new int[p.arraySize];
        memcpy ( values , p.values, p.arraySize*sizeof(int) );
        p.values[1] = 0;
        arraySize = p.arraySize;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-08-22
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多