BAMBI860 2022-03-31 22:57 采纳率: 100%
浏览 54
已结题

c++矩阵乘法,要求用类封装

关键在于他有很多要求,不在于乘法的实现,要用类来封装矩阵,还要用模板,初学者感觉困难,求思路,最好有代码,谢

img

  • 写回答

2条回答 默认 最新

  • 关注

    找找模板封装的例子看看,只是用typename T来代替数据类型而已。

    img

    参考如下:

    #include <iostream>
    using namespace std;
    
    template <typename T>
    class Matrix
    {
    private:
        int m_m,m_n; //m*n
        T** m_data;
    public:
        Matrix();
        Matrix(int m,int n,T** data);//初始化时赋值
        
        //从键盘读入
        void setData(int m,int n);
        void show();
        Matrix operator*(const Matrix<T> &b);
        Matrix operator=(const Matrix<T> &b);
    };
    
    template <typename T>
    Matrix<T> Matrix<T>::operator=(const Matrix<T> &b)
    {
        Matrix<T> a(b.m_m,b.m_n,b.m_data);
        return a;
    }
    
    template <typename T>
    Matrix<T> Matrix<T>::operator*(const Matrix<T> &b)
    {
        int m = this->m_m;
        int n = b.m_n;
        //无法相乘的情况
        if(this->m_n != b.m_m)
            return Matrix();
    
        T** data = new T*[m];
            
        //计算
        for (int i=0;i<m;i++)
        {
            data[i] = new T[n];
            for (int j=0;j<n;j++)
            {
                data[i][j] = 0;
                for(int k = 0;k<this->m_n;k++)
                    data[i][j] += this->m_data[i][k] * b.m_data[k][j];
            }
        }
    
        Matrix<T> cc(m,n,data);
        //释放空间
        for(int i=0;i<m;i++)
            delete[] data[i];
        delete[] data;
        data = 0;
        return cc;
    }
    
    template <typename T>
    void Matrix<T>::show()
    {
        if(m_data)
        {
            for (int i =0;i<m_m;i++)
            {
                for(int j=0;j<m_n;j++)
                    cout << m_data[i][j] <<" ";
                cout <<endl;
            }
        }
    }
    
    
    template <typename T>
    void Matrix<T>::setData(int m,int n)
    {
        m_m =m;
        m_n = n;
        if(m_data)
        {
            for(int i=0;i<m_m;i++)
                delete[] m_data[i];
            delete[] m_data;
            m_data = 0;
        }
        cout <<"请输入"<<m<<"*"<<n<<"的矩阵:"<<endl;
        m_data = new T*[m];
        for (int i = 0;i<m;i++)
        {
            m_data[i] = new T[n];
            for(int j=0;j<n;j++)
                cin >>m_data[i][j];
        }
    }
    
    
    template <typename T>
    Matrix<T>::Matrix()
    {
        m_m = 0;
        m_n = 0;
        m_data = 0;
    }
    
    template <typename T>
    Matrix<T>::Matrix(int m,int n,T** data)
    {
        m_m = m;
        m_n = n;
        m_data = new T*[m];
        for (int i = 0;i<m;i++)
        {
            m_data[i] = new T[n];
            for(int j=0;j<n;j++)
                m_data[i][j] = data[i][j];
        }
    }
    
    
    int main()
    {
        int m,n;
        
        cout <<"请输入第一个矩阵的m和n:";
        cin >>m>>n;
        cout << "请输入"<<m<<"*"<<n<<"的整数矩阵:"<<endl;
        int** data = new int*[m];
        for(int i = 0;i<m;i++)
        {
            data[i] = new int[n];
            for(int j=0;j<n;j++)
                cin >> data[i][j];
        }
        Matrix<int> ma(m,n,data);
    
        for (int i=0;i<m;i++)
        {
            delete[] data[i];
            data[i]=0;
        }
        delete[] data;
    
        //ma.show();
        
        //构建第二个矩阵
        cout << "请输入第二个矩阵的m和n:";
        cin >>m>>n;
        cout << "请输入"<<m<<"*"<<n<<"的整数矩阵:"<<endl;
        data = new int*[m];
        for(int i = 0;i<m;i++)
        {
            data[i] = new int[n];
            for(int j=0;j<n;j++)
                cin >> data[i][j];
        }
        Matrix<int> mb(m,n,data);
    
        for (int i=0;i<m;i++)
        {
            delete[] data[i];
            data[i]=0;
        }
        delete[] data;
    
        //mb.show();
        
        Matrix<int> c = ma*mb;
        c.show();
        return 0;
    
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月9日
  • 已采纳回答 4月1日
  • 创建了问题 3月31日

悬赏问题

  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教