关于我的简单数组代码的一些问题,这就像一个非常简单的向量

时间:2014-11-06 22:58:05

标签: c++

#include<iostream>
#include<string>
using namespace std;
class  my_int_array
private:
int num;
int *ptr;
public:
my_int_array(int n){
    num = n;
    int *ptr = new int[n];
    for (int i = 0; i < n; i++){
        ptr[i] = 0;
    }
}
my_int_array(int x[], int size){
    int *ptr = new int[size];
    for (int i = 0; i < size; i++){
        ptr[i] = x[i];
    }
}
my_int_array(my_int_array&other){
    int *ptr = new int[other.num];
    for (int i = 0; i < other.num; i++){
        ptr[i] = other.ptr[i];
    }
    num = other.num;
}
int size(){
    return num;
}
int at(int n){
    if (n > num - 1 || n < 0){
        cout << "out of range" << endl;
    }
    else{
        return ptr[n];
    }
}
my_int_array &operator=(const my_int_array&temp){
    int *ptr = new int[temp.num];
    for (int i = 0; i < temp.num; i++){
        ptr[i] = temp.ptr[i];
    }
    num = temp.num;
}
~my_int_array(){
    delete[] ptr;
}
};
int main(){
my_int_array arrry1(5);
cout << arrry1.size() << endl;
}

当我运行这个程序时,它可以显示5,但.exe会崩溃,有人可以帮助我在这段代码中找到我的错误

它有什么: 1.创建一个空数组; 2. size()返回数组的大小,而at()返回某个索引的值。 3.复制构造函数和复制的赋值运算符 4.当传递一个数组和数组的大小时,该类应该将该数组复制到它的元素。

如果有人可以提供帮助,那就太棒了,因为我是新学员,任何建议都会受到欢迎,谢谢!

1 个答案:

答案 0 :(得分:0)

你有一个微妙的错误(假设你修复了每次声明ptr的明显错误):

my_int_array &operator=(const my_int_array&temp){
    ptr = new int[temp.num];
    for (int i = 0; i < temp.num; i++){
        ptr[i] = temp.ptr[i];
    }
    num = temp.num;
}

问题是你的函数应该返回对my_int_array的引用,但它不会返回任何内容。这是undefined behavior,因此任何分配对象的代码都会出错(可能会崩溃)。

但是,一旦你解决了这个问题,你就会遇到另一个问题,那就是你没有检查自我分配。

要解决此问题,我将向您展示实施operator=的简单方法:

#include <algorithm>
//...
my_int_array &operator=(const my_int_array& rhs)
{
    my_int_array temp(rhs);
    std::swap(temp.ptr, ptr);
    std::swap(temp.num, num);
    return *this;
}

就是这样。这可以通过使用my_int_array的复制构造函数和析构函数来实现,因此它需要一个完美的复制构造函数和my_int_array的析构函数。查看copy and swap idiom