Перегруженная (<<) функция друга, не может получить доступ к данным класса publi c - PullRequest
0 голосов
/ 24 апреля 2020

Кажется, я не могу получить доступ к переменным класса через функции или иным образом, из-за перегруженной функции << друга Значения кажутся случайными числами внутри функций, хотя я переопределяю их в основном. </p>

Я нахожусь в процессе создания программы, которая выполняет различные матричные функции, используя перегруженные операторы. Сейчас я пытаюсь заставить функции работать с матрицами размеров, не равными 3x3, и они работали ранее с глобальной переменной s, но я бы хотел, чтобы rows был переопределен до того, как << и >> будут называется.

#include <iostream>
using namespace std;
#define s 3
class Matrix
{
private:

public:
    int rows,cols;
    int rows1, rows2, cols1, cols2;
    int **m;
    void setRows(int rowsa);
    int getRows();
    Matrix()
    {
        m = new int *[10];
        for (int i = 0; i < 10; i++)
        {
            m[i] = new int[10];
        }
    }
    friend Matrix operator+(Matrix &m1, Matrix &m2);
    friend Matrix operator-(Matrix &m1, Matrix &m2);
    friend Matrix operator*(Matrix &m1, Matrix &m2);
    friend ostream &operator<<(ostream &os, Matrix &m1);
    friend istream &operator>>(istream &is, Matrix &m1);
};

Matrix operator+(Matrix &m1, Matrix &m2)
{
    Matrix m3 = Matrix();

    for (int i = 0; i < s; i++)
    {
        for (int j = 0; j < s; j++)
            m3.m[i][j] = m1.m[i][j] + m2.m[i][j];
    }
    return m3;
}
Matrix operator-(Matrix &m1, Matrix &m2)
{
    Matrix m3 = Matrix();

    for (int i = 0; i < s; i++)
    {
        for (int j = 0; j < s; j++)
            m3.m[i][j] = m1.m[i][j] - m2.m[i][j];
    }
    return m3;
}

Matrix operator*(Matrix &m1, Matrix &m2)
{
    Matrix m3 = Matrix();
    Matrix rix;
    for (int i = 0; i < rix.rows1; i++)
    {
        for (int j = 0; j < rix.cols2; j++)
        {
            for (int k = 0; k < rix.cols1; k++)
            {
                m3.m[i][j] = m1.m[i][k] * m2.m[k][j];
            }
        }
    }
    return m3;
}

ostream &operator<<(ostream &os, Matrix &m)
{
    Matrix rix;
    for (int i = 0; i < rix.rows; i++)
    {
        for (int j = 0; j < rix.cols; j++)
            os << m.m[i][j] << " ";
        os << "\n";
    }
    return os;
}
istream &operator>>(istream &is, Matrix &m1)
{
    //overloaded >> to input the values of a matrix
// PROBLEM IS HERE
    Matrix rix;

    cout<<"value of rows1"<<rix.rows1<<endl;
    cout<<"value of rows"<<rix.rows<<endl;
    cout<<"value of getRows"<<rix.getRows()<<endl;

    int k;
    for (int i = 0; i < rix.rows; i++)
    {
        for (int j = 0; j < rix.cols; j++)
        {
            cout << "Enter element "
                 << "(" << i << "," << j << "): ";
            cin >> k;
            m1.m[i][j] = k;
        }
    }
}
void Matrix::setRows(int rowsa){
    rows= rowsa;
}
int Matrix::getRows(){
    return rows;
}
int main()
{
    int rosx;
    Matrix m1 = Matrix();
    Matrix m2 = Matrix();
    Matrix rix;

    cout << "Number of rows for the first Matrix? (max 10)" << endl;
    cin >> rix.rows1;

    cout << "Number of columns for the first Matrix? (max 10)" << endl;
    cin >> rix.cols1;

    cout << "Number of rows for the second Matrix? (max 10)" << endl;
    cin >> rix.rows2;

    cout << "Number of columns for the second Matrix? (max 10)" << endl;
    cin >> rix.cols2;

    cout << "input the elements of the first matrix: " << endl;
    rix.setRows(rix.rows1);
    cout <<rix.rows;
    cin >> m1;

    cout << m1;

    cout << "input the elements of the second matrix: " << endl;
    rix.rows = rix.rows2;

    rix.cols = rix.cols2;
    cin >> m2;
    cout << m2;

    Matrix m3 = m1 * m2;
    cout << "output" << endl;
    cout << m3;
    return 0;
}

1 Ответ

3 голосов
/ 24 апреля 2020

Ваши значения являются мусором, потому что ваш конструктор не дает никаких значений вашим переменным.

Matrix()
{
    m = new int *[10];
    for (int i = 0; i < 10; i++)
    {
        m[i] = new int[10];
    }
}

Нигде в этом конструкторе вы не дадите значения rows, cols, rows1 , rows2, cols1 или cols2. Так что неудивительно, что они имеют значения мусора.

Я полагаю, это должно быть

Matrix()
{
    m = new int *[10];
    for (int i = 0; i < 10; i++)
    {
        m[i] = new int[10];
    }
    rows = 10;
    cols = 10;
}

Хотя я не понимаю, почему вы есть три строковые переменные и три переменные cols.

Другое недоразумение состоит в том, что у вас есть две переменные с именем rix

int main()
{
    int rosx;
    Matrix m1 = Matrix();
    Matrix m2 = Matrix();
    Matrix rix; // one variable called rix

istream &operator>>(istream &is, Matrix &m1)
{
    //overloaded >> to input the values of a matrix
// PROBLEM IS HERE
    Matrix rix; // another variable called rix

Очевидно, вы думаете, что это одна и та же переменная, но это не так. Две переменные в разных функциях - это разные переменные , даже если они имеют одинаковое имя .

Вот еще одно недоразумение

ostream &operator<<(ostream &os, Matrix &m)
{
    Matrix rix;
    for (int i = 0; i < rix.rows; i++)
    {
        for (int j = 0; j < rix.cols; j++)
            os << m.m[i][j] << " ";
        os << "\n";
    }
    return os;
}

По какой-то причине вы написали эту функцию в выведите переменную m, но используя строки и столбцы из совершенно другой переменной с именем rix. Это не имеет никакого смысла. Строки и столбцы должны быть получены из переменной m, поскольку это матрица, которую вы пытаетесь напечатать.

На самом деле я просто царапаю поверхность. Этот код полон недоразумений. Вы должны рассмотреть, как работает C ++. В частности, как работают конструкторы, как работают переменные, и просто подумайте немного более логично о коде, который вы пишете Это имеет смысл.

Я бы начал снова. Во второй раз код будет лучше.

...