// matriz2d.cpp - Definición de la plantilla Matriz2d
#include <iostream>
using namespace std;

template<class T> Matriz2d<T>::Matriz2d(int nf, int nc) :
Vector<T>(nf)
{
  nCols = nc; // columnas
  matriz2d = reinterpret_cast<T **>(&(Vector<T>::operator[](0)));
  for (int f = 0; f < nf; f++)
    matriz2d[f] = Vector<T>::asignarMem(nCols); // memoria para la fila f
}

template<class T> Matriz2d<T>::~Matriz2d()
{
  destruir();
}

template<class T> void Matriz2d<T>::destruir()
{
  for (int f = 0; f < filas(); f++)
    delete [] matriz2d[f];
}
    
template<class T> T& Matriz2d<T>::operator()(int f, int c)
{
  return matriz2d[f][c];
}

// Constructor copia
template<class T> Matriz2d<T>::Matriz2d(const Matriz2d<T>& v) :
matriz2d(0)
{
  *this = v;
}

// Operador de asignación
template<class T>
Matriz2d<T>& Matriz2d<T>::operator=(const Matriz2d<T>& v)
{
  if (matriz2d)
  {
    if (v.filas() != filas() || v.columnas() != columnas())
    {
      cout << "Las matrices no tienen las mismas dimensiones\n";
      return *this;
    }
    destruir(); // borrar la matriz actual.
  }
  Vector<T>::operator=(v); // operador = de la base
  nCols = v.nCols;
  // Asignar a matriz2d la dirección del primer elemento de la
  // matriz de punteros
  matriz2d = reinterpret_cast<T **>(&(Vector<T>::operator[](0)));
  for (int f = 0; f < filas(); f++)
  {
    matriz2d[f] = Vector<T>::asignarMem(nCols); // asignar memoria
    for (int c = 0; c < nCols; c++)
      matriz2d[f][c] = v.matriz2d[f][c]; // copiar los valores
  }
  return *this;           // permitir asignaciones encadenadas
}

