Оператор + перегрузка для C ++ в классе - PullRequest
0 голосов
/ 25 октября 2018

Это для назначения на моем факультете, я хочу сделать перегрузку для operator + для матрицы. Я создаю новую матрицу и помещаю сумму в эту матрицу, и я печатаю ее, но она ничего не печатает, так что кто-нибудь может помочь мне решить эту проблему?

class matrix
{
private:
  int* data;
  int row, col;

public:
  matrix();
  matrix(int r, int c, int num[]);
  friend ostream& operator << (ostream& out, matrix mat1);
  friend istream& operator >> (istream& in, matrix& mat);
  int getrow();
  int getcol();
  int getdata(int i);
  int setrow(int r);
  int setcol(int c);
  int setdata(int num[]);
  matrix operator+ (const matrix& mat2);
};

Теперь я пишу этот код, и он ничего не печатает, может кто-нибудь помочь мне решить эту проблему?сначала я делаю сеттер и геттер для данных.

matrix::matrix(){
  row=0;
  col=0;
}

matrix::matrix(int r, int c, int num[])
{
  row = r;
  col = c;
  data = new int[r*c];
  for(int i=0; i < (r*c); i++)
    data[i] = num[i];
}

matrix::getrow() { return row; }
matrix::getcol() { return col; }

matrix::setrow(int r) { row=r; }
matrix::setcol(int c) { col=c; }

matrix matrix::operator+ (const matrix& mat2)
{
  matrix mat3;
  for(int i=0; i < mat3.getrow() * mat3.getcol(); i++) {
    mat3.data[i] = data[i] + mat2.data[i];
  }
  return mat3;
}

int main(){
  int num2 [] = {1,2,3,4,5,6,7,8,8};
  int num3 [] = {1,0,0,0,1,0,0,0,1};

  matrix x;

  matrix mat2(3, 3, num2);
  matrix mat3(3, 3, num3);
  matrix mat4;
  mat4 = mat2 + mat3;
  cou << mat4;

  return 0;
}

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Вот несколько предложений

1.Ошибка инициализации

попробуйте добавить метод перегрузки конструктора следующим образом:

matrix::matrix(int r, int c)
{
    row = r;
    col = c;
    data = new int[r*c];
    for (int i = 0; i < r*c; i++) {
        data[i] = 0;
    }
}

, затем в operator+ функции перегрузки инициируйте mat3 с помощью этого метода:

matrix mat3(mat2.getrow(), mat2.getcol());


2. перегрузка = оператор необходим, поскольку вы решаете mat4 =

matrix matrix::operator= (const matrix& from_mat)
{
    matrix to_mat(from_mat.getrow(), from_mat.getcol());
    for (int i = 0; i < from_mat.getrow() * from_mat.getcol(); i++) {
        to_mat.data[i] = from_mat.data[i];
    }
    return to_mat;
}


3.в функции main, просто используйте matrix mat4 = mat2 + mat3;

0 голосов
/ 25 октября 2018

В вашем сообщении много не так.Другие отметили несколько вещей, вот более полный список IMO:

  • Вы спрашиваете о проблеме с отображением, но ваш заголовок о operator+, и вы не предоставляете реализациюostream& operator<< ( ostream&, matrix& ).Нет также причины, по которой отображение содержимого матрицы должно изменить его, поэтому оно должно быть ostream& operator<< ( ostream&, const matrix& ) (это также устранит необходимость в варианте передачи по значению).
  • Некоторые из ваших конструктороввыделить память, но вы не определили деструктор (~matrix()) для обработки освобождения и не имеете конструктора копирования (matrix( const matrix& )).Прочтите о деструкторах и управлении памятью.
  • Вы перегружаете конструктор по умолчанию matrix(), но в настоящее время невозможно обновить размер или содержимое вашей матрицы.Какой смысл использовать конструктор по умолчанию, если создаваемая им пустая матрица не может быть изменена позже?Вы также должны определить data = nullptr в этом случае.
  • Роль сеттеров для числа строк и столбцов (setrow, setcol) неясна;установка атрибутов размера должна влиять на распределение памяти (т.е. data), но в настоящее время это не так.Вы также объявляете эти методы как возвращающие int s, но ничего не возвращаете.Вы должны удалить оба этих метода;в них нет необходимости, и ваша реализация в настоящее время неверна.
  • В operator+ первое, что нужно проверить, это то, что вход имеет тот же размер, что и текущая матрица.Второе - правильно распределить вывод (с помощью matrix( row, col )), что подразумевает необходимость в дополнительном конструкторе matrix(int r, int c) (как указано в других ответах).Третий - объявить этот метод константным matrix operator+ ( const matrix& other ) const.
  • В вашей основной есть опечатка, cou должно быть std::cout.
  • Наконец, что произойдет, если я напишу matrix x( -1, -5, NULL );?
0 голосов
/ 25 октября 2018

Вы не установили размеры mat3, поэтому getrow() и getcol() оба возвращают 0, а буфер слишком мал, чтобы содержать введенные вами данные, поэтому вы также страдаете от переполнения буфера.

Добавить приватный конструктор, который принимает только измерения без инициализации значений.

Ваша следующая проблема - у вас нет конструктора копирования / перемещения / оператора = (), поэтому назначениев mat3 в main() не четко определены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...