【问题标题】:Overloaded ( << ) friend function, can't access public class data重载(<<)友元函数,无法访问公共类数据
【发布时间】:2020-08-08 09:50:30
【问题描述】:

我似乎无法通过函数或其他方式访问类变量,在我重载的

我正在编写一个使用重载运算符执行各种矩阵函数的程序。现在我正在尝试使函数与大小不是 3x3 的矩阵一起工作,并且这些函数更早地与全局变量 s 一起工作,但我希望在 &lt;&lt;&gt;&gt; 之前重新定义 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;
}

【问题讨论】:

  • 您似乎对在输入和输出函数开始时声明新矩阵感到困惑。在您的输入中,您有一个非常好的矩阵m1。它的行和列没有设置任何东西,所以迭代它们没有意义,但这就是你应该使用的矩阵。

标签: c++ class matrix operator-overloading istream


【解决方案1】:

你的值是垃圾,因为你的构造函数没有给你的变量任何值。

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

在此构造函数中,您没有为 rowscolsrows1rows2cols1cols2. 赋值,因此它们具有垃圾值也就不足为奇了。

应该是这样的

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

虽然我不明白为什么你有三个 rows 变量和三个 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++ 的工作原理。特别是构造函数的工作方式,变量的工作方式,以及对您正在编写的代码进行更合乎逻辑的思考。它必须有意义。

我会重新开始。第二次写代码会更好。

【讨论】:

  • @Gomi,非常感谢发帖者为您的问题提供了很好的答案,如果您觉得它解决了您的问题,表示感谢的正确方法是accept it
猜你喜欢
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 2015-02-11
  • 2011-08-03
  • 2014-01-26
相关资源
最近更新 更多