функция в классе массив

344
22 февраля 2017, 21:41

Доброго времени суток! У меня есть класс массив.

Я создаю массив

class Matrix
{
private:
int line, column, **mas;
public:
 Matrix doTask(Matrix matrix);
Matrix(int n = 1, int m = 1 ) : line(n), column(m)
{
    mas = new int*[n];
    for (int i = 0; i < n; i++)
    {
        mas[i] = new int[m];
    }
}
Matrix(const Matrix &masToCopy) // конструктор копирования
{
    line = masToCopy.line;
    column= masToCopy.column;
    mas = new int*[line];   // для новой копии
for (int i= 0; i <line; i++)
    mas[i] = new int[column];
for (int i = 0; i<line; i++) 
    for (int j = 0; j < column; j++) 
        mas[i][j] = masToCopy.mas[i][j];
}
friend istream& operator >> (istream &in, Matrix &el) //перегрузка >>
{
    for (int i = 0; i < el.line; i++)
    {
        for (int j = 0; j < el.column; j++)
        {
            in >> el.mas[i][j];
        }
    }
    return in;
}
friend ostream& operator << (ostream &out, Matrix &el) //перегрузка <<
{
    for (int i = 0; i < el.line; i++)
    {
        cout << "\n";
        for (int j = 0; j < el.column; j++)
        {
            out << el.mas[i][j];
            cout << " ";
        }
    }
    return out;
}
};

   int main()
{
Matrix Task(4, 3);
cout << "\nВведите массив размером 4 на 3 \n";
cin >> Task;
cout << Task.doTask(Task);
 }

И пытаюсь передать его в функцию, которая увеличивает все отрицательные нечетные числа в 2 раза

Matrix Matrix::doTask(Matrix matrix)
{
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; i < 3; j++)
        {
            if (matrix.mas[i][j] < 0 && matrix.mas[i][j] % 2 != 0)
            {
                matrix.mas[i][j] *= 2;
            }
        }
    }
    return matrix;
}

Но строчка с if вызывает исключение. Как это исправить?

Answer 1

В коде вывода написана белиберда

for (int i = 0; i < 4; i++)
{
    for (int j = 0; i < 3; j++)
                    ^

Отлавливать ошибки "по невнимательности" вы должны уметь самостоятельно. StackOverflow - это не сайт и разряда "найдите мои опечатки за меня". Удивляет также использование "магических констант" 4 и 3, в то время как у вас в классе есть поля, задающие размер массива.

Отдельно стоит заметить, что параметр оператора << должен быть ссылкой на константу

friend ostream& operator << (ostream &out, const Matrix &el)
                                           ^^^^^

иначе ваше cout << Task.doTask(Task); является некорректным. (Он компилируется в MSVC лишь благодаря одному из расширений языка.)

Отдельный вопрос, как я уже писал в комментариях: что это за метод такой doTask, который обрабатывает посторонний объект, а не *this. Зачем тогда этот doTask вообще является методом Matrix, если с *this он не работает вообще? Вот этот вызов в main - Task.doTask(Task) - это просто феерически странно. Зачем объект Task передается сам в свой собственный метод? (Это совсем не обязательно является ошибкой в общем случае, но зачем это нужно именно в вашем случае - не ясно.)

Если вы уж хотите иметь такой метод, то сделайте так

Matrix Matrix::doTask() const
{
   Matrix result(*this);
   for (int i = 0; i < line; i++)
   {
       for (int j = 0; j < column; j++)
       {
           if (result.mas[i][j] < 0 && result.mas[i][j] % 2 != 0)
           {
               result.mas[i][j] *= 2;
           }
       }
   }
   return result;
}

и соответственно

cout << Task.doTask();
READ ALSO
что не так в makefile

что не так в makefile

здравствуйте, есть такой makefile:

403
Ввод строк символами в двумерный вектор

Ввод строк символами в двумерный вектор

Имеется vector<vector<char>> и файл с текстомЦель: ввод этого текста в двумерный вектор

360
Не работает cin

Не работает cin

Задача - создать класс Группа, содержащий массив объектов класса Студент, и добавить в него меню для работы с группойЯ решил реализовать меню...

307
Очень медленно работает выборка INNER JOIN - MySQL

Очень медленно работает выборка INNER JOIN - MySQL

У меня есть таблица компании, таблица недвижимости и таблица с параметрами недвижимостиПри выборе недвижимости, например квартиры на съем,...

299