Generikus mátrix osztály

Írjon generikus (template) n*m-es mátrixokat reprezentáló osztályt!
- Írjon konstruktort, ami paraméterként a mátrix méreteit kapja meg.
- A mátrixhoz lehessen hozzáadni, belőle n*m-es mátrixokat. Amennyiben a dimenziók nem megfelelőek, a függvények dobjanak kivételt.
- A mátrix egyes elemeit le lehet kérdezni és be lehet állítani a () operátor használatával. Pl: M(2, 4) = 5; ha M egy egész számokat tároló mátrix. Hibás sor, vagy oszlopindex megadása esetén kivételt kell dobni!
- átadható érték szerint függvényparaméterként!
helyesen kezeli a többszörös értékadást (s1=s2=s3, ahol s1, s2, s3 ugyanazzal a típussal példányosított template-ek)!
- Milyen követelményeket támaszt az osztály az elemek típusaival szemben (pl. alapértelmezett konstruktor, operator+ rendelkezésre állása)?
- Írjon egy egyszerű programrészletet, amely bemutatja az osztály szolgáltatásainak használatát!



A megoldásért kattints ide!

// Matrix.h
#ifndef MATRIX_H
#define MATRIX_H

#include <exception>

// Megjegyzes: ez a megoldas egydimenzios egy tombot hasznal az osztalyon belul, de hivo fel fele
// ugy mutatja be mintha ketdimenzios lenne. Nyilvan nem ez az egyetlen udvozito megoldas, a
// feladat megoldhato ketdimenzios dinamikus tombbel is.
template <class T>
class Matrix {
 private:
  unsigned Rows, Columns;
  T *pData;

 public:
  Matrix(unsigned R = 0, unsigned C = 0);
  Matrix(const Matrix &M) { pData = 0; *this = M; }
  ~Matrix() { delete[] pData; }

  Matrix &operator=(const Matrix &M);
  Matrix operator+(const Matrix &M) const;
  T &operator()(unsigned R, unsigned C);
  const T &operator()(unsigned R, unsigned C) const;
};


template <class T>
Matrix<T>::Matrix(unsigned R, unsigned C) {
 Rows = R;
 Columns = C;
 pData = (Rows > 0 && Columns > 0) ? (new T[Rows * Columns]) : 0;
}


template <class T>
Matrix<T> &Matrix<T>::operator=(const Matrix<T> &M) {
 if (this == &M) {
  return *this;
 }

 delete[] pData;
 Rows = M.Rows;
 Columns = M.Columns;
 pData = (Rows > 0 && Columns > 0) ? (new T[Rows * Columns]) : 0;

 for (unsigned i = 0; i < Rows * Columns; i++) {
  pData[i] = M.pData[i];
 }

 return *this;
}


template <class T>
Matrix<T> Matrix<T>::operator+(const Matrix<T> &M) const {
 if (Rows != M.Rows && Columns != M.Columns) {
  throw std::exception("A ket matrix dimenzioi nem egyeznek, ezert nem adhatok ossze!");
 }

 Matrix RetVal = *this;

 for (unsigned i = 0; i < Rows * Columns; i++) {
  RetVal.pData[i] = RetVal.pData[i] + M.pData[i];
 }

 return RetVal;
}


template <class T>
T &Matrix<T>::operator()(unsigned R, unsigned C) {
 if (R >= Rows || C >= Columns) {
  throw std::exception("Hibas sor- vagy oszlopindex!");
 }

 return pData[R * Columns + C];
}


template <class T>
const T &Matrix<T>::operator()(unsigned R, unsigned C) const {
 if (R >= Rows || C >= Columns) {
  throw std::exception("Hibas sor- vagy oszlopindex!");
 }

 return pData[R * Columns + C];
}

#endif // MATRIX_H



// Main.cpp
#include "Matrix.h"
#include <iostream>
using namespace std;


int main(){
 Matrix<int> m1(2, 2);
 m1(0, 0) = 2;
 m1(0, 1) = 0;
 m1(1, 0) = 0;
 m1(1, 1) = 2;

 Matrix<int> m2 = m1 + m1;
 
 cout << m2(0, 0) << " " << m2(0, 1) << endl;
 cout << m2(1, 0) << " " << m2(1, 1) << endl;

 return 0;
}

// Kovetelmenyek a tarolt tipussal szemben (ha az nem beepitett tipus):
// - rendelkezik alapertelmezett konstruktorral
// - egymashoz lehet oket rendelni az = operatorral
// - ossze lehet belole adni ket peldanyt a + operatorral




2008.02.01. 13:04:22 |  Permalink  |  Hozzászólások száma: 0  |  Tárgyszavak: Sablonok


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások