-1

我已经尝试了很多方法来找出这个错误,但我仍然是一个初学者,无法弄清楚。我已经完全按照我讲义中的方式做了。我们需要显示矩阵的输出,但由于一些错误,我的程序卡住了。它说,例如,star尚未在此范围内声明。我试过删除using namespace std;,我试过改变头文件,但仍然没有解决方案。

#include <iostream> 
#include <stdlib.h> 
#include <iomanip>
 
using namespace std;
 
class  Matrix
{
    private:
        int numRows; 
        int numCols;
        float elements[3][3];
        
        public:
            Matrix (int rows=0, int cols=0 )
            {
                numRows=rows;
                numCols=cols;
            }
            
            friend ostream& operator<<(std::ostream&,Matrix&); 
            friend istream& operator>>(std::istream&,Matrix&);
            friend ostream& spaceFirst(std::ostream&);
            friend ostream& spaceBetween(std::ostream&);
            friend ostream& line(std::ostream&);
            friend ostream& newline( ostream&);
            friend ostream& star(std::ostream &);           
            friend ostream& sound(std::ostream&);
};

istream&operator>>(istream&input, Matrix&m)
{
    for (int i=0;i<m.numRows; i++)
    {
        for (int j=0;j,m.numCols;j++)
        {
            input>>m.elements[i][j];
        }
     } 
    return input; 
}
//defining the operator<<
ostream&operator<<(std::ostream &output, Matrix&m)
{
    for (int i=0;i<60; i++)
    {
        if(i==30)
        {
            output<<"Displaying th Matrix:";
        }
        else
        {
            output<<star;
        }
        
    }
    output<<newline;
    for(int r=0;r<m.numRows;r++)
    {
        output<<spacefirst<<line;
        for (int c=0;c<m.numCols;c++)
        {
            output<<spaceBetween<<m.elements[r][c]<<sound<<spaceBetween;
        }
        output<<spaceBetween<<line;
        output<<newline;
    }
    output<<newline;
    return output;
}
ostream & spacefirst(std::ostream & output)
{
    output<<setw(33);
    return output;
}

std::ostream & spaceBetween(std::ostream & output)
{
    output<<setw(4);
    return output;
}

std::ostream & line(std::ostream & output)
{
    output<<"|";
    return output;
}

std::ostream & newline(std::ostream & output)
{
    output<<endl;
    return output;
}

std::ostream & star(std::ostream & output)
{
    output<<"*";
    return output;
}

std::ostream & sound(std::ostream & output)
{
    output<<"\a";
    return output;
}
int main()
{
    Matrix matrix(3,3);
    cin>>matrix;
    cout<<matrix;
    system("Pause");
    return 0;
}
4

1 回答 1

1

operator <<将这些操纵器加为好友并不会神奇地使它们在全局命名空间中可用,而这正是它们需要提供给加好友的免费函数(如operator >>矩阵类)才能访问它们的地方。

放弃破坏循环条件和明显的不可编译的spaceFirstvs拼写错误spacefirst,将以下内容放在任何使用之前(在类本身是一个明显的选择之前):

#include <iostream>
#include <cstdlib>
#include <iomanip>
using namespace std;

ostream &spaceFirst(std::ostream &);
ostream &spaceBetween(std::ostream &);
ostream &line(std::ostream &);
ostream &newline(ostream &);
ostream &star(std::ostream &);
ostream &sound(std::ostream &);

class Matrix
{
   // etc...

也要保留朋友声明(尽管老实说,大多数/所有这些都不需要加好友)。

或者,您也可以在源文件中的任何使用之前重新定位裸操纵器。

看到它住在这里

于 2021-08-21T11:05:32.683 回答