Cómo acceder a los métodos de otra Clase? [SOLUCIONADO...ESO CREÍA]

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: akodo, maiku

Responder
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Cómo acceder a los métodos de otra Clase? [SOLUCIONADO...ESO CREÍA]

Mensaje por cerenkov » Vie Sep 30, 2011 2:26 am

Hace algún tiempo, hice un esbozo de una clase matriz (la llame incipiente en este foro) con una serie de métodos para multiplicar matrices, inversa, etc. Hoy en día, estoy implementando una clase coordenadas. Dentro de sus métodos, hay uno que puede aprovecharse de la multiplicación y suma de matrices y multiplicación de un escalar por una matriz. Ese código funciona sin problemas dentro del programa principal; tal como lo coloco a continuación. En lenguaje procedimental no tengo problemas para transformar esas porciones de código en funciones y hacerlo más compacto, sin embargo, después de probar varias cosas (entre ellas lo de las clase amigas) sigo sin encontrar la manera de acceder a los métodos de la referida clase Matriz. Agradecería si alguien pudiese darme una orientación al respecto. Incluso, la clase Matriz la complementé con métodos para transformar (copiar) un vector en una matriz 3x1 ó 1x3 (Coordenadas esta definida en R3) por si hace falta como paso intermedio en el acceso.

Código: Seleccionar todo

void Coordenadas::

	CambioGeocent_Geo (int selector, Coordenadas v, Coordenadas &t){

	const double pi = 3.14159265358979323846;

	double a, b;

	double Rx, Ry, Rz, esc;

	double D[3][1];

	if (selector == 1) {

//****************************** Bursa-Wolf para Canoa-Regven ************************************************

		 Rx=-2.904, Ry=-0.817, Rz=-1.210, esc = 1+(-0.000004688);

		 D[0][0] = -296.497, D[1][0] = 85.260, D[2][0] = -263.967;

	// Elipsoide de WGS 84

		a = 6378137.0;  b = 6356752.3142;

//**************************************************************************************************************

	}

	if (selector == 2) {

//****************************** Bursa-Wolf para Regven-Canoa ************************************************

		 Rx= 2.904, Ry= 0.817, Rz= 1.210, esc = 1+(0.000004688);

		 D[0][0] = 296.497, D[1][0] = -85.260, D[2][0] = 263.967;

	// Elipsoide de Hayford

		a = 6378388.0, b = 6356911.946130;

//**************************************************************************************************************

	}

	if (selector == 3) {

//*******************************Bursa-Wolf para WGS 84-ED50 ****************************************************
	
		Rx=-1.2438, Ry=-0.0195, Rz=-1.1436, esc = 1+(-0.00000939);

		D[0][0] = 131.032, D[1][0] = 100.251, D[2][0] = 163.354;

	// Elipsoide de Hayford

		a = 6378388.0, b = 6356911.946130;

//*****************************************************************************************************************

	}

	if (selector == 4) {

//*******************************Bursa-Wolf para ED50-WGS 84 ****************************************************
	
		Rx= 1.2438, Ry= 0.0195, Rz= 1.1436, esc = 1+(0.00000939);

		D[0][0] = -131.032, D[1][0] = -100.251, D[2][0] = -163.354;

	// Elipsoide de WGS 84

		a = 6378137.0;  b = 6356752.3142;

//*****************************************************************************************************************

	}

	Rx = (Rx*pi)/(3600.0*180.0); Ry = (Ry*pi)/(3600.0*180.0); Rz = (Rz*pi)/(3600.0*180.0);	

	double R[][3]={ 1.0,  Rz,  -Ry,
                    -Rz,  1.0,  Rx,
                     Ry, -Rx,  1.0};

	double B[][1] = {v.a[0],
                     v.a[1],
                     v.a[2]};

	double C[][1] = {0.0,
                     0.0,
                     0.0};

// escalar por una matriz
	int i, j, k;

	for(i=0; i < 3; i++){

		for(j=0; j < 3; j++){

			R[i][j]= esc*R[i][j];			
		
		}

	}
	
// producto de matrices

	for(i=0; i<3; i++){

		for(j=0; j<1; j++){

		C[i][j]=0;			

			for(k=0; k<3; k++){

				C[i][j]= C[i][j]+R[i][k]*B[k][j];

			}

		}

	}

// Suma de matrices 

	for(i=0; i<3; i++){

		for(j=0; j<1; j++){

			C[i][j]= C[i][j] + D[i][j];

		}

	}

	double e1, e2, p, theta, lambda, phi, N;

	e1 = sqrt (pow(a,2) - pow(b, 2)) / a;
	e2 = sqrt (pow(a,2) - pow(b, 2)) / b;

	p =sqrt(pow(C[0][0],2) + pow(C[1][0],2));

	theta = atan((C[2][0]*a)/(p*b));

	phi = atan((C[2][0]+pow(e2,2)*b*pow(sin(theta),3))/(p-pow(e1,2)*a*pow(cos(theta),3)));

	lambda = atan(C[1][0]/C[0][0]);

	N = a*a/sqrt(a*a*pow(cos(phi),2)+b*b*pow(sin(phi),2));

	t.a[0] = lambda*180.0/pi;

	t.a[1] = phi*180.0/pi;

	t.a[2] = (p/cos(phi))-N;

}
Esta es la declaración de cada clase:

Coordenadas:

Código: Seleccionar todo

#include <iostream>

using namespace std;

#include <cstdlib>
#include <cmath>

class Coordenadas {

	private:

		double a[3];

	public:

		Coordenadas(); // Constructor de la clase coordenadas
	   ~Coordenadas(); // Destructor de la clase coordenadas

		void Iniciar(double m[3]);
		void Mostrar(int p);

		void CambioUtmGeo (int huso, int selector, char hem, Coordenadas v, Coordenadas &t);
		void CambioGeoUtm (int selector, char long_, char lat_, Coordenadas v, Coordenadas &t);

		void CambioGeo_Geocent (int selector, Coordenadas v, Coordenadas &t);

		void CambioGeocent_Geo(int selector, Coordenadas v, Coordenadas &t);

		Coordenadas CambioUtmGeo (int huso, int selector, char hem, Coordenadas v);

		double operator & (Coordenadas v); // Producto escalar de dos vectores

		double operator % (Coordenadas v); // Distancia entre dos vectores

		friend Coordenadas operator +(Coordenadas t, Coordenadas s);
		friend Coordenadas operator -(Coordenadas t, Coordenadas s);

		friend Coordenadas operator *(double n, Coordenadas s); // escalar por un vector

		friend istream& operator >> (istream &entrada, Coordenadas &z);

		friend ostream& operator << (ostream &salida, Coordenadas &z);

		friend void initMatriz(Coordenadas);

};
Matriz:

Código: Seleccionar todo

#include <cstdlib>
#include <iomanip>
#include <cassert>

class Matriz {

	private:

		double A[10][10];

		int rows, cols;

	public:


		 Matriz(int n, int m);  // Constructor de la clase
		~Matriz();  // Destructor de la clase

		void initMatriz(double **x);
		void showMatriz();
		Matriz CopyVectoRowmat(double a[3]);
		Matriz CopyVectoColmat(double a[3]);

		Matriz SumaMatriz(Matriz a, Matriz b);

		friend istream& operator >> (istream &entrada, Matriz &z); //sobrecarga del operador >>
		friend ostream& operator << (ostream &salida, Matriz &z); //sobrecarga del operador <<

		friend Matriz operator +(Matriz x, Matriz y); //sobrecarga al operador + para sumar matrices
		friend Matriz operator -(Matriz x, Matriz y); //sobrecarga al operador - para restar matrices
		friend Matriz operator *(Matriz x, Matriz y); //sobrecarga al operador * para multiplicar matrices
		friend Matriz operator *(double x, Matriz y); //sobrecarga al operador * para multiplicar escalar*matriz

		void invermat(double **a);

		friend class Coordenadas;

};
Última edición por cerenkov el Dom Oct 02, 2011 6:40 pm, editado 5 veces en total.
Avatar de Usuario
Juanp_1982
Forista Mayor
Forista Mayor
Mensajes: 913
Registrado: Dom Ago 13, 2006 7:00 am
Ubicación: Toronto, Canada

Re: Cómo acceder a los métodos de otra Clase?

Mensaje por Juanp_1982 » Vie Sep 30, 2011 3:40 am

lo que tienes que hacer es heredar la clase de las funciones que necesitas para que puedas utilizarlas como un hijo

algo asi como:
class Matriz : public Coordenadas {

}

donde Matriz es el hijo y Coordenadas es el padre (o lo puedes poner viceversa, el padre es la funcion que creastes de primero y cuyas funciones quieres usar en tu nueva clase)
La Hora Mas oscura es una antes de que Amanesca (Anonimo)
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: Cómo acceder a los métodos de otra Clase?

Mensaje por akodo » Vie Sep 30, 2011 11:01 am

Juanp_1982 escribió:lo que tienes que hacer es heredar la clase de las funciones que necesitas para que puedas utilizarlas como un hijo

algo asi como:
class Matriz : public Coordenadas {

}

donde Matriz es el hijo y Coordenadas es el padre (o lo puedes poner viceversa, el padre es la funcion que creastes de primero y cuyas funciones quieres usar en tu nueva clase)
Habría que pensar si merece la pena heredar o no, ya que posiblemente habría que sobrescribir algunos métodos de la clase heredada. Además, tal como lo propone cerenkov, el código debería ser (según he mirado):

Código: Seleccionar todo

class Coordenadas : public Matriz { ..... }
Las dudas que tengo al respecto, es que de ser así, en cualquier sitio donde pudieras poner un objeto de la clase matriz, también podrías poner un objeto de la clase coordenadas (al menos en teoría, que de c++ no sé casi nada). Así pues, por ejemplo, en la clase matriz podrías sumar una matriz con una coordenada, cosa que por lo general no debería ser posible porque las dimensiones no tienen por qué coincidir.
Por otro lado, a favor de lo que dice Juanp_1982, es cierto que una coordenada es, o se puede considerar, un tipo especial de matriz (con 1 fila y x columnas), con lo que se puede apoyar la herencia a cambio de robustecer la implementación de la clase matriz para que no haya errores al considerar lo que he expuesto arriba.

La otra opción que tienes es simplemente utilizar una matriz de forma interna. Simplemente, en vez de declarar un "double a[3]" para almacenar los datos de las coordenadas, utilizas una "matriz m" inicializada en el constructor de la clase coordenadas.
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Re: Cómo acceder a los métodos de otra Clase?

Mensaje por cerenkov » Sab Oct 01, 2011 12:03 am

Gracias por responder. Las ideas que Uds proponen están plasmadas aquí:

http://www.modelo.edu.mx/univ/virtech/p ... cplus5.htm

y traté de seguir el procedimiento para implementarlo pero no funciona en el ejemplo. Después de limpiar algo el código pude lograr que algunas cosas funcionaran pero como estaba muy cansado me fui a dormir. Se ve que esto de la herencia es complejo y, a veces, los que tratan de explicarla, cuando testan sus ejemplos, no se ajustan al ANSI C++. Por eso es que funciona en sus casos y no en el mio (como lo estoy programando en Linux este si no me deja esas libertades; a menos que yo lo fuerce pero yo no quiero porque es lo que me garantiza la portabilidad a Windows).

En mi caso, me gusta probar el código antes de postearlo en mi Blog (como debería ser). Pueden ver que funciona aquí:

Método para convertir coordenadas geocéntricas en geográficas (cambio de datum 7 parámetros): Clase Coordenadas (C/C++)

donde el programa principal es bastante compacto.

Sólo me resta probar lo que señalan, en mi caso, pero antes voy a ver si puedo hacer funcionar el del link de arriba. Me parece que la Clase base es Matriz, de la cual quiero heredar sus métodos (entre ellos los de copiar un vector como matriz), para emplearlos en la Clase derivada Coordenadas. Algo de lo que me estoy dando cuenta en este preciso momento es que no estaba añadiendo la Clase Matriz a la Clase Coordenadas sino sólo en el programa principal. Para resolver conflictos de doble inclusión está el enunciado #ifndef. Si logro resolver lo del link es probable que pueda hacerlo con mi ejemplo.

Saludos

Editado -- Vie Sep 30, 2011 5:25 pm --

Después de analizar la herencia en las Clases derivadas del link, por fin corregí todos los errores, compiló y produjo los resultados esperados. Hice los cambios en mi caso y, después de los innumerables errores que producía, por fin lo reduje a esto:

Código: Seleccionar todo

zeito@Debian:~/Desktop/COORDENADAS$ g++ coordenadas.cpp -o coordenadas
In file included from coordenadas.cpp:1:0:
Coordenadas.h: In constructor ‘Coordenadas::Coordenadas()’:
Coordenadas.h:53:26: error: no matching function for call to ‘Matriz::Matriz()’
Coordenadas.h:53:26: note: candidates are:
Matriz.h:107:1: note: Matriz::Matriz(int, int)
Matriz.h:107:1: note:   candidate expects 2 arguments, 0 provided
Matriz.h:5:7: note: Matriz::Matriz(const Matriz&)
Matriz.h:5:7: note:   candidate expects 1 argument, 0 provided
Ahora me tocará ver como resuelvo lo de los constructores porque allí es donde está el problema. No ajustan y por tanto parece obvio porque no puede haber herencia. En otras palabras, parece que va a ser necesario considerar lo de la Clase Coordenadas como vectores filas o vectores columnas, es decir, matrices de orden 1x3 o 3x1 (en R3). Sé, por lo que he leído, que una Clase puede tener más de un constructor. Vamos a ver si con el adecuado se resuelve el problema.
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: Cómo acceder a los métodos de otra Clase?

Mensaje por akodo » Sab Oct 01, 2011 1:27 am

Tampoco te lo puedo asegurar, pero creo que tienes que llamar al constructor de la superclase.
La solución más sencilla sería modificar el constructor de coordenadas para que se ajustara al de la matriz:

Código: Seleccionar todo

class Coordenadas : public Matriz { 
 public:
  Coordenadas(int a, int b);
  ~Coordenadas();  //destructor permanece igual
}
La otra opción (si es que funciona) es la siguiente:

Código: Seleccionar todo

class Coordenadas : public Matriz { 
 public:
  Coordenadas() : Matriz (3,1) {.......}  //llamarías al constructor de la matriz 3x1 siempre.
}
La información la he sacado de los siguientes links:
http://www.horstmann.com/ccj2/ccjapp3.html
http://stackoverflow.com/questions/1208 ... ling-rules
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])
Avatar de Usuario
Juanp_1982
Forista Mayor
Forista Mayor
Mensajes: 913
Registrado: Dom Ago 13, 2006 7:00 am
Ubicación: Toronto, Canada

Re: Cómo acceder a los métodos de otra Clase?

Mensaje por Juanp_1982 » Sab Oct 01, 2011 2:03 am

akodo escribió:Tampoco te lo puedo asegurar, pero creo que tienes que llamar al constructor de la superclase.
La solución más sencilla sería modificar el constructor de coordenadas para que se ajustara al de la matriz:

Código: Seleccionar todo

class Coordenadas : public Matriz { 
 public:
  Coordenadas(int a, int b);
  ~Coordenadas();  //destructor permanece igual
}
La otra opción (si es que funciona) es la siguiente:

Código: Seleccionar todo

class Coordenadas : public Matriz { 
 public:
  Coordenadas() : Matriz (3,1) {.......}  //llamarías al constructor de la matriz 3x1 siempre.
}
La información la he sacado de los siguientes links:
http://www.horstmann.com/ccj2/ccjapp3.html
http://stackoverflow.com/questions/1208 ... ling-rules

akodo creo que para llamar al constructor de matriz no necesitas los parentesis (ya que no es una funcion sino una clase) y te falto dos punt


entonces seria asi


class Coordenadas : public Matriz {
public:
Coordenadas :: Matriz (3,1); //llamarías al constructor de la matriz 3x1 siempre. // aqui no tendiras que desarrollar ningun codigo porque todo estaria //"codificado" en matriz
}


espero que lo que yo estoy diciendo sea parte de lo que tu propones sino me disculpo...
La Hora Mas oscura es una antes de que Amanesca (Anonimo)
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Re: Cómo acceder a los métodos de otra Clase?

Mensaje por cerenkov » Sab Oct 01, 2011 3:08 pm

Gracias, Juanp_1982 y akodo por sus sugerencias. Por fin compiló y arrojó resultados favorables. La clase base es Matriz y la derivada es Coordenadas. En el programa principal se incluye la clase base (Matriz) y en la Clase Matriz se incluye la clase derivada y se hace pública (que si uno lo analiza es lo lógico pero me empeñe en lo contrario). Lo estaba haciendo al revés y por eso es que arrojaba esos errores de compilación que mencioné arriba. Antes, me puse a "inventar" unos constructores en la clase Coordenadas y aunque compilaba, en la ejecución arrojaba violación de segmento. Los eliminé e hice lo que ya saben.

Ahora, como hace el compilador para detectar que en un sentido es correcto y en el otro no, verdaderamente desconozco la respuesta. Todavía tengo mucho que aprender. Se resolvió, aparentemente, lo de la herencia. Lo que si no he probado todavía es si dentro de Coordenadas puedo acceder a los métodos de Matriz. En el programa principal doy por descontado que puedo acceder a ambos porque ya ha sido testado.

Saludos
Avatar de Usuario
Juanp_1982
Forista Mayor
Forista Mayor
Mensajes: 913
Registrado: Dom Ago 13, 2006 7:00 am
Ubicación: Toronto, Canada

Re: Cómo acceder a los métodos de otra Clase?

Mensaje por Juanp_1982 » Sab Oct 01, 2011 3:17 pm

cerenkov escribió:Gracias, Juanp_1982 y akodo por sus sugerencias. Por fin compiló y arrojó resultados favorables. La clase base es Matriz y la derivada es Coordenadas. En el programa principal se incluye la clase base (Matriz) y en la Clase Matriz se incluye la clase derivada y se hace pública (que si uno lo analiza es lo lógico pero me empeñe en lo contrario). Lo estaba haciendo al revés y por eso es que arrojaba esos errores de compilación que mencioné arriba. Antes, me puse a "inventar" unos constructores en la clase Coordenadas y aunque compilaba, en la ejecución arrojaba violación de segmento. Los eliminé e hice lo que ya saben.

Ahora, como hace el compilador para detectar que en un sentido es correcto y en el otro no, verdaderamente desconozco la respuesta. Todavía tengo mucho que aprender. Se resolvió, aparentemente, lo de la herencia. Lo que si no he probado todavía es si dentro de Coordenadas puedo acceder a los métodos de Matriz. En el programa principal doy por descontado que puedo acceder a ambos porque ya ha sido testado.

Saludos

si puedes solo tienes que llamar a la funcion que quieras asi

Código: Seleccionar todo

Matrix :: funcion(); 
Matrix :: funcion(var1);

La Hora Mas oscura es una antes de que Amanesca (Anonimo)
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Re: Cómo acceder a los métodos de otra Clase?

Mensaje por cerenkov » Dom Oct 02, 2011 6:37 pm

Juanp_1982 escribió:
cerenkov escribió:Gracias, Juanp_1982 y akodo por sus sugerencias. Por fin compiló y arrojó resultados favorables. La clase base es Matriz y la derivada es Coordenadas. En el programa principal se incluye la clase base (Matriz) y en la Clase Matriz se incluye la clase derivada y se hace pública (que si uno lo analiza es lo lógico pero me empeñe en lo contrario). Lo estaba haciendo al revés y por eso es que arrojaba esos errores de compilación que mencioné arriba. Antes, me puse a "inventar" unos constructores en la clase Coordenadas y aunque compilaba, en la ejecución arrojaba violación de segmento. Los eliminé e hice lo que ya saben.

Ahora, como hace el compilador para detectar que en un sentido es correcto y en el otro no, verdaderamente desconozco la respuesta. Todavía tengo mucho que aprender. Se resolvió, aparentemente, lo de la herencia. Lo que si no he probado todavía es si dentro de Coordenadas puedo acceder a los métodos de Matriz. En el programa principal doy por descontado que puedo acceder a ambos porque ya ha sido testado.

Saludos

si puedes solo tienes que llamar a la funcion que quieras asi

Código: Seleccionar todo

Matrix :: funcion(); 
Matrix :: funcion(var1);

No funciona. Sólo lo hace al revés y así no "hereda" ya que sigue con el problema de los constructores. He decidido hacer nuevamente desde cero la clase Matriz pero esta vez con templates. Así queda más general. Con ésto comencé:

Clase Matriz con plantillas (template): C/C++

Saludos
Avatar de Usuario
Juanp_1982
Forista Mayor
Forista Mayor
Mensajes: 913
Registrado: Dom Ago 13, 2006 7:00 am
Ubicación: Toronto, Canada

Re: Cómo acceder a los métodos de otra Clase? [SOLUCIONADO...ESO CREÍA]

Mensaje por Juanp_1982 » Dom Oct 02, 2011 6:49 pm

puedes postiar tus codigos? vamos a aclarar cual es la clases base, cual es la derivada y como hacer el proceso de "herencia"
La Hora Mas oscura es una antes de que Amanesca (Anonimo)
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Re: Cómo acceder a los métodos de otra Clase? [SOLUCIONADO...ESO CREÍA]

Mensaje por cerenkov » Dom Oct 02, 2011 9:06 pm

Juanp_1982 escribió:puedes postiar tus codigos? vamos a aclarar cual es la clases base, cual es la derivada y como hacer el proceso de "herencia"
Gracias, Juan, por tu interés. En este momento estoy reconstruyendo la Clase Base Matriz desde cero, con templates, para luego meterme con la de Coordenadas. Cuando se tienen funciones amigas lo de los templates no es tan fácil pero, después de tanto darle, ya sobrecargué mi primer operador amigo que pertenece a Matriz (ya lo había hecho con uno de ostream pero es diferente la sintaxis). Cuando los tenga listo a ambos lo posteo aquí.

Saludos
Avatar de Usuario
Juanp_1982
Forista Mayor
Forista Mayor
Mensajes: 913
Registrado: Dom Ago 13, 2006 7:00 am
Ubicación: Toronto, Canada

Re: Cómo acceder a los métodos de otra Clase? [SOLUCIONADO...ESO CREÍA]

Mensaje por Juanp_1982 » Dom Oct 02, 2011 9:10 pm

cerenkov escribió:
Juanp_1982 escribió:puedes postiar tus codigos? vamos a aclarar cual es la clases base, cual es la derivada y como hacer el proceso de "herencia"
Gracias, Juan, por tu interés. En este momento estoy reconstruyendo la Clase Base Matriz desde cero, con templates, para luego meterme con la de Coordenadas. Cuando se tienen funciones amigas lo de los templates no es tan fácil pero, después de tanto darle, ya sobrecargué mi primer operador amigo que pertenece a Matriz (ya lo había hecho con uno de ostream pero es diferente la sintaxis). Cuando los tenga listo a ambos lo posteo aquí.

Saludos
jajajaja no hay problema, tenia tiempo que no trabajaba con c++ y ahora me dio curiosidad, no quiero confundirte con lo que te voy a decir, analizalo y ve si lo deseas aplicar a no

dependiendo de la estrategia que vayas usar yo pienso que los templates no son necesarios y teniendo dos clases diferentes va a ser mas sencillo y mas facil de reusar
La Hora Mas oscura es una antes de que Amanesca (Anonimo)
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: Cómo acceder a los métodos de otra Clase? [SOLUCIONADO...ESO CREÍA]

Mensaje por akodo » Dom Oct 02, 2011 11:21 pm

Juanp_1982 escribió: si puedes solo tienes que llamar a la funcion que quieras asi

Código: Seleccionar todo

Matrix :: funcion(); 
Matrix :: funcion(var1);

¿Eso no es para llamar a métodos estáticos de la clase? Dado que no son métodos estáticos los que estás llamando deberías utilizarlo normalmente. Al menos así funciona en java (con diferente sintáxis, claro).

Código: Seleccionar todo

Coordenadas *m = new Coordenadas();  //si es que se puede inicializar así
m->funcion();  //donde funcion es una función heredada de matriz
En cuanto a los templates, (después de informarme de lo que son) no creo que sea necesario. Creo que por lo menos deberías limitarlo a que el contenido de la matriz sea numérico (si es que eso se puede hacer con c++), ya que vas a hacer operaciones de suma, resta y multiplicación que pueden no estar definidas con otros tipos de contenidos (strings, por ejemplo).
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])
Avatar de Usuario
Juanp_1982
Forista Mayor
Forista Mayor
Mensajes: 913
Registrado: Dom Ago 13, 2006 7:00 am
Ubicación: Toronto, Canada

Re: Cómo acceder a los métodos de otra Clase? [SOLUCIONADO...ESO CREÍA]

Mensaje por Juanp_1982 » Dom Oct 02, 2011 11:38 pm

akodo escribió:
Juanp_1982 escribió: si puedes solo tienes que llamar a la funcion que quieras asi

Código: Seleccionar todo

Matrix :: funcion(); 
Matrix :: funcion(var1);

¿Eso no es para llamar a métodos estáticos de la clase? Dado que no son métodos estáticos los que estás llamando deberías utilizarlo normalmente. Al menos así funciona en java (con diferente sintáxis, claro).

Código: Seleccionar todo

Coordenadas *m = new Coordenadas();  //si es que se puede inicializar así
m->funcion();  //donde funcion es una función heredada de matriz
me hicistes dudar por un momento y resulta que no es necesesario ponerlo.

acabo de revisar, si la funcion en el padre es publica solo tiene que llamarla como cualquier otra funcion, si la funcion es privada tiene que usar el operador " :: ". tambien tiene que usar este operador si la funcion que quiere esta en un bisabuelo o tatarabuelo
La Hora Mas oscura es una antes de que Amanesca (Anonimo)
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Re: Cómo acceder a los métodos de otra Clase? [SOLUCIONADO...ESO CREÍA]

Mensaje por cerenkov » Mar Oct 04, 2011 3:59 pm

Me parece que Uds están en lo correcto (por otra parte, lo de los templates es sólo una tarea pendiente). El problema de la Clase derivada está en su constructor (el compilador señala que no se ajusta con el de Matriz). Da error cuando intento compilarla haciendo Matriz public. Haciendo Coordenadas public entonces no produce errores pero a mi lo que me interesa es acceder a los métodos de Matriz desde Coordenadas y no al revés, es decir, la forma que compila.

Cuando tenga listo en Matriz lo que me interesa voy a crear una nueva Coordenadas pero con sólo 2 o 3 métodos (para no perder mucho tiempo) y ver si puedo acceder a los métodos de Matriz.

Nota para akodo: Los templates (plantillas) permiten la generalización de la tipificación de datos de tal manera que es posible hacer un determinado procedimiento con un sólo método. Esto significa que no tienes que crear un método para enteros, otro para float, otro para double, etc. Con sólo usar el especificador <tipo> en el programa principal cuando declaras los objetos es suficiente.

Editado -- Mar Oct 04, 2011 9:29 am --

Bueno, ya terminé de implementar la nueva Clase Matriz. La declaración y métodos aquí:

Autovalores y Autovectores en Clase Matriz con plantillas (template): C/C++

Ahora voy con la Clase Coordenadas pero esta vez la voy a llamar Vector. Al constructor le voy a pasar parámetros, es decir, la dimensión del vector (ésto por analogía con lo que he hecho con las librerías de Lapack). El método que me interesa que herede de Clase Matriz o viceversa es convertir un vector en una Matriz diagonal o una Matriz diagonal convertirla en un Vector. A medida que voy entendiendo esto de las Clases, aquí es importante la herencia para que pueda mezclar en el programa principal ambos tipos de objetos e interconvertirlos.
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje