Duda referenciar una matriz desde un objeto

Iniciado por teamanare, 25 Mayo 2014, 16:06 PM

0 Miembros y 1 Visitante están viendo este tema.

teamanare

Buenas a todos!

Tengo el siguiente problemilla en un ejercicio de C++:

Quiero crear una matriz que esté formada por un numero de filas y columas y una variable contenidoMatriz[][] en la cual voy guardando
todo el contenido de la misma.También en la clase "Matriz", hay operaciones a realizar en la matriz.

El contenido de cada elemento de la matriz son objetos de la clase "Elemento".
A su vez, la clase "Elemento" tiene 2 hijas (que son los valores verdaderos de la matriz), "CeldaInteger" y "CeldaSumar".


"CeldaInteger" son celdas que tienen un número entero.

"CeldaSumar" son celdas que tienen un string, que representa el rango de filas o columnas a sumar(solo un rango).

  Ejemplo de "CeldaSumar":
      - "c203" lo que significa es = devuelve la suma de la columna 2, del rango de elementos del 0 al 3.
      - "f001" lo que significa es = devuelve la suma de la fila 0, del rango de elementos del 0 al 1.


Problema:

Lo que quiero hacer es un método en "Matriz", devolverResultadoSuma(int numFila, int numColumna), que a su vez haga:

   return this->contenidoMatriz[numFila][numColumna]->getSuma()

y devuelva el resultado de realizar la suma que se indique en la celda, sobre esa posición.
(El método SIEMPRE se llamará sobre elementos "CeldaSumar").

Mi problema es que no se cómo hacer para pasar la matriz a getSuma().
Por el enunciado no puedo pasar el elemento matriz como
parámetro. Creo que tengo que refenciar la matriz de alguna forma para que getSuma() tenga matriz sobre la que moverse.

Le he estado dando mil vueltas a este ejercicio, y creo que tiene que haber alguna manera de pasar la matriz a getSuma(), pero no consigo hayar la solución. Habia pensado en, como se llama mediante, por ejemplo, matriz1>devolverResultadoSuma(0,0), que a su vez va a llamar a getSuma() sobre esa posición, se tiene que poder pasar la matriz que le está llamando.

Muchas gracias por vuestra ayuda de antemano.

Un saludo.

eferion

#1
Estás mezclando conceptos.

¿De quién es la responsabilidad de devolver el valor de la celda? De la clase "CeldaSumar" o de la matriz?

* Si es de la clase "CeldaSumar" (desde mi punto de vista lo más lógico) ésta clase debería tener un puntero o referencia a la matriz para poder pedir los valores que correspondan. De esta forma no sería necesario implementar nada en la clase "Matriz", ya que las operaciones necesarias para realizar los cálculos están implementadas en "CeldaSumar".

* Si es de la clase "Matriz", deberías comprobar si el elemento pedido es de tipo "CeldaSumar" y en este caso realizar la suma que éste elemento contenga... lo que sucede en este caso es que no aprovechas el polimorfismo y el diseño con dos clases para "Elemento" no tiene sentido.

Las clases deberían tener esta forma:

Código (cpp) [Seleccionar]

class Elemento
{
 public:
   virtual int Valor( ) const = 0;
};

class CeldaInteger
{
 public:

   void SetValor( int valor )
   { _valor = valor; }

   int Valor( ) const
   { return _valor; }

 private:

   int _valor;
};

class CeldaSumar( )
{
 public:

   CeldaSumar( Matriz* matriz )
     : _matriz( matriz )
   {
   }

   void SetSuma( const std::string& suma )
   { _suma = suma; }

   int Valor( ) const
   {
     int valor = 0;

     // Algoritmo para calcular la suma
     // valor += _matriz->Valor( fila, columna );

     return valor;
   }

 private:

   Matriz* _matriz;
   std::string _suma;
};