#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.当传递一个数组和数组的大小时,该类应该将该数组复制到它的元素。
如果有人可以提供帮助,那就太棒了,因为我是新学员,任何建议都会受到欢迎,谢谢!
答案 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
。