我是c ++的新手,我必须使用指针创建一个2D数组。我已完成数组的创建,但由于“分段错误”,我在初始创建矩阵后无法运行任何内容。我相信这是来自我的任务操作员,但我不确定。这可能来自复制构造函数,但因为我们必须使用指针而丢失了。任何帮助将不胜感激。
#ifndef My_Matrix_H
#define My_matrix_H
#include "My_matrix.h"
#include <stdexcept>
My_matrix::My_matrix() //contructor
{
n = 0;
m = 0;
ptr = NULL;
}
My_matrix::My_matrix(int n1, int m1) //creation of the matrix
{
ptr = new int*[n1];
for (int i = 0; i < n1; i++)
{
ptr[i] = new int[m1];
for (int j = 0; j < m1; j++)
{
ptr[i][j] = 0;
}
}
}
My_matrix::My_matrix(const My_matrix& mat) //copy constructor
{
n = mat.n;
m = mat.m;
ptr = new int*[n];
for (int i = 0; i < n; i++)
{
ptr[i] = new int[m];
for (int j = 0; j < m; j++)
{
ptr[i][j] = mat.ptr[i][j];
}
}
}
My_matrix::~My_matrix() //destructor
{
for (int i = 0; i < n; i++)
{
delete[] ptr[i];
}
delete[] ptr;
}
My_matrix& My_matrix::operator=(const My_matrix& mat) //assignmemt operator
{
n = mat.n;
m = mat.m;
ptr = new int*[n];
cout << "1" << endl;
for (int i = 0; i < n; i++)
{
cout << "2" << endl;
ptr[i] = new int[m];
for (int j = 0; j < m; j++)
{
cout << "3" << endl;
ptr[i][j] = mat.ptr[i][j];
}
}
}
void My_matrix::elemset(int i, int j, int num) //puts stuff into matrix
{
ptr[i][j] = num;
}
}#endif
答案 0 :(得分:1)
[1]在My_matrix(int,int)
成员中n
和m
未设置(如果您调用这些成员中的任何一个(复制构造函数,赋值运算符或析构函数),则会导致所有问题)在My_matrix(int,int)
创建对象而不设置n,m
后,您的应用程序必须崩溃)。
[2] My_matrix::operator=
应该返回*this
。
[3]在My_matrix::operator=
中,您应删除以前分配的数据。
答案 1 :(得分:0)
答案。复制/交换是最有效的,正如@PaulMcKenzie给出的那样。
My_matrix& My_matrix::operator=(const My_matrix& mat)
{
My_matrix temp(mat);
std::swap(n,temp.n);
std::swap(m, temp.m);
std::swap(ptr, temp.ptr);
return *this;
}