[C con Clase] problema con matriz

Steven Davidson steven en conclase.net
Vie Jul 6 15:31:22 CEST 2007


Hola Miguel,

El pasado 2007-07-05 04:15:55, miguel escribió:

m> Buenas noches Steven (y cualquier persona que lea este mensaje)

[CORTE]

m> no estoy seguro y por eso me gustaría aclarar el punto, pero el hecho de que haya declarado 
m> float matriz; 
m> en algo que yo entiendo como un campo (creo que es así que se llama cuando uno crea una variable dentro de una clase), y luego haga:

Sí. A veces se llama "dato o variable miembro", "propiedad", o incluso "atributo".

m> clase{
m>   float matriz[][]={{1,2,3},{4,5,6},{7,8,9}};
m> en algo que se me ocurre que pueda ser un constructor (ya que viene después de lo que parece la declaración de la clase, pero a lo que le faltaría (quizás por esto fué tu "mirando exclusivamente la declaración de 'matriz'") el espacio para los parámetros o la declaración "class" para ser una clase (eliminando los dos renglones anteriores y aclarando mi duda), no haría que, aparte de el error que has mencionado, estuviera declarando dos variables diferentes con el mismo nombre?, si es así, habría conflicto en la compilación? o el compilador tomaría la última como una variable local?, pero entonces, cómo se haría para llegar a 

Exactamente. Existirían dos variables: una local al "constructor" y otra "menos local" en el ámbito de la clase. Esto es análogo a hacer lo siguiente:

int func()
{
  int i=0;

  for( int i=1; i<100; i++ )
  {
    ...
  }
  ...
}

Aquí tendríamos dos variables diferentes con el mismo nombre, 'i'. Dentro del bucle 'for', usaríamos "su" variable 'i', que es local al bucle. No podríamos usar la variable 'i' local a 'func()', estando dentro del bucle 'for'.

> la otra sin tener conflicto? algo como this.matriz? y, de ser así, podría hacer una asignación this.matriz=matriz[0][0]? y/o inversa? matriz[0][0]=this.matriz? la verdad no tengo muy claro este punto y si pudieses (o cualquier otra persona que desee hacerlo) aclararme este punto te (se) lo agradecería enormemente.  

Sí; así es. Usaríamos explícitamente el puntero 'this' para referirnos a los datos miembros. Por ejemplo,

class Algo
{
private:
  int dato;

public:
  Algo( int dato )
  {
    this->dato = dato;
  }
};

Me temo que varias personas escriben código así. Personalmente, habría elegido otro nombre para el parámetro como por ejemplo '_dato', 'nDato', 'ddato', o algo por el estilo. Usar el mismo nombre de algo que ya existe son ganas de tener problemas aposta.

En cuanto a tu duda, no deberías tenerla, porque te has contestado a ti mismo. Al fin y al cabo, son dos variables declaradas correctamente aunque sean diferentes, porque están en diferentes ámbitos. En este caso, puedes usar el puntero 'this' para poder distinguir entre una y otra. Siguiendo tu ejemplo,

class Otro
{
private:
  float matriz[3][3];

public:
  Otro( float matriz[3][3] )
  {
    this->matriz[0][0] = matriz[2][2];
    this->matriz[1][1] = matriz[1][1];
    this->matriz[0][2] = matriz[2][1];
  }
};


Espero haber aclarado la duda.

Steven


Más información sobre la lista de distribución Cconclase