Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

lin_0912.h: the matrix class #ifndef MATRIX_H #define MATRIX_H #include <cassert

ID: 3883148 • Letter: L

Question

   lin_0912.h: the matrix class 
   #ifndef MATRIX_H #define MATRIX_H  #include <cassert>  #include <cstdint> #include <queue> #include <vector> #include <algorithm> /**  * A generic 2-dimensional array class  * @author Jon Beck  * @version 8 September 2017  */ template <class Object> class Matrix {  public:   /**    * Constructor, specifying number of both rows and columns    * @param rows the number of rows    * @param cols the number of columns    */   Matrix( uint16_t rows, uint16_t cols );    /**    * Access to an element to allow modification    * @param row the row index    * @param col the column index    * @return reference to the element at that position    */   Object & at( uint16_t row, uint16_t col );    /**    * Constant access to an element    * @param row the row index    * @param col the column index    * @return constant reference to the element at that position    */   const Object & at( uint16_t row, uint16_t col ) const;    /**    * Destructor to free allocated memory    */   ~Matrix();    /**    * Copy constructor to make 1-1 copy of existing matrix    * @param m the existing matrix to be copied    */   Matrix( const Matrix<Object> & m ); // Copy constructor    /**    * Disallow the rvalue copy constructor    */   Matrix( const Matrix<Object> && m ) = delete;    /**    * Assignment operator to make 1-1 copy of existing matrix    * @param m the existing matrix to be copied    */   Matrix & operator= ( const Matrix<Object> & m ); // Assignment operator    /**    * Disallow the rvalue assignment operator    */   Matrix & operator= ( const Matrix<Object> && m ) = delete;    /**    * Accessor to determine how many rows are in the matrix    * @return the number of rows in the matrix    */   uint16_t numrows() const;    /**    * Accessor to determine how many columns are in the matrix    * @return the number of columns in the matrix    */   uint16_t numcols() const;   private:   uint16_t rows;   uint16_t cols;   Object* data; };  template <class Object> Matrix<Object>::Matrix( uint16_t rows, uint16_t cols ) : rows( rows ), cols( cols ) {   data = new Object[ rows * cols ]; }  template <class Object> Matrix<Object>::~Matrix() {   delete[] data; }  template <class Object> Object & Matrix<Object>::at( uint16_t row, uint16_t col ) {   assert( row < rows && col < cols );   return data[ cols * row + col ]; }  template <class Object> const Object & Matrix<Object>::at( uint16_t row, uint16_t col ) const {   assert( row < rows && col < cols );   return data[ cols * row + col ]; }  template <class Object> uint16_t Matrix<Object>::numrows() const {   return rows; }  template <class Object> uint16_t Matrix<Object>::numcols() const {   return cols; }     bool is_connected(Matrix<uint8_t> & graph)    {           vector< bool >reached(graph.size(),false);       queue< uint8_t > to_be_explored;        to_be_explored.push(0);       while(!to_be_explored.empty())       {         uint8_t current_node=to_be_explored.front();         to_be_explored.pop();         reached.at(current_node)=true;         for(uint8_t adjacent=0; adjacent<graph.numcols(); ++adjacent)         {            if(!reached.at(adjacent) && graph.at(current_node, adjacent))            {               to_be_explored.push(adjacent);            }          }       }       return find(reached.begin(), reached.end(), false) == reached.end();    }      #endif 

Explanation / Answer

#ifndef MATRIX_H #define MATRIX_H #include #include #include #include #include /** * A generic 2-dimensional array class * @author Jon Beck * @version 8 September 2017 */ template class Matrix { public: /** * Constructor, specifying number of both rows and columns * @param rows the number of rows * @param cols the number of columns */ Matrix( uint16_t rows, uint16_t cols ); /** * Access to an element to allow modification * @param row the row index * @param col the column index * @return reference to the element at that position */ Object & at( uint16_t row, uint16_t col ); /** * Constant access to an element * @param row the row index * @param col the column index * @return constant reference to the element at that position */ const Object & at( uint16_t row, uint16_t col ) const; /** * Destructor to free allocated memory */ ~Matrix(); /** * Copy constructor to make 1-1 copy of existing matrix * @param m the existing matrix to be copied */ Matrix( const Matrix & m ); // Copy constructor /** * Disallow the rvalue copy constructor */ Matrix( const Matrix && m ) = delete; /** * Assignment operator to make 1-1 copy of existing matrix * @param m the existing matrix to be copied */ Matrix & operator= ( const Matrix & m ); // Assignment operator /** * Disallow the rvalue assignment operator */ Matrix & operator= ( const Matrix && m ) = delete; /** * Accessor to determine how many rows are in the matrix * @return the number of rows in the matrix */ uint16_t numrows() const; /** * Accessor to determine how many columns are in the matrix * @return the number of columns in the matrix */ uint16_t numcols() const; private: uint16_t rows; uint16_t cols; Object* data; }; template Matrix::Matrix( uint16_t rows, uint16_t cols ) : rows( rows ), cols( cols ) { data = new Object[ rows * cols ]; } template Matrix::~Matrix() { delete[] data; } template Object & Matrix::at( uint16_t row, uint16_t col ) { assert( row