Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Portada » Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 15 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Jue Jun 17, 2010 5:23 am
Mensajes: 402
Ubicación: Venezuela

Nota Publicado: Vie Sep 30, 2011 2:26 am 
Arriba  
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:
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:
#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:
#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;

};

_________________
[Reglamento del foro] [Blog]


Última edición por cerenkov el Dom Oct 02, 2011 6:40 pm, editado 5 veces en total
 Perfil  

Desconectado
Forista Mayor
Forista Mayor
Avatar de Usuario

Registrado: Dom Ago 13, 2006 7:00 am
Mensajes: 913
Ubicación: Toronto, Canada

Nota Publicado: Vie Sep 30, 2011 3:40 am 
Arriba  
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)

 Perfil  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 8:00 am
Mensajes: 1457
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Vie Sep 30, 2011 11:01 am 
Arriba  
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:
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" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Jue Jun 17, 2010 5:23 am
Mensajes: 402
Ubicación: Venezuela

Nota Publicado: Sab Oct 01, 2011 12:03 am 
Arriba  
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:
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.

_________________
[Reglamento del foro] [Blog]

 Perfil  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 8:00 am
Mensajes: 1457
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Sab Oct 01, 2011 1:27 am 
Arriba  
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:
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:
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/120876/c-superclass-constructor-calling-rules

_________________
Descargue el gestor de mp3 "Music Manager" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  

Desconectado
Forista Mayor
Forista Mayor
Avatar de Usuario

Registrado: Dom Ago 13, 2006 7:00 am
Mensajes: 913
Ubicación: Toronto, Canada

Nota Publicado: Sab Oct 01, 2011 2:03 am 
Arriba  
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:
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:
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/120876/c-superclass-constructor-calling-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)

 Perfil  

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Jue Jun 17, 2010 5:23 am
Mensajes: 402
Ubicación: Venezuela

Nota Publicado: Sab Oct 01, 2011 3:08 pm 
Arriba  
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

_________________
[Reglamento del foro] [Blog]

 Perfil  

Desconectado
Forista Mayor
Forista Mayor
Avatar de Usuario

Registrado: Dom Ago 13, 2006 7:00 am
Mensajes: 913
Ubicación: Toronto, Canada

Nota Publicado: Sab Oct 01, 2011 3:17 pm 
Arriba  
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:
Matrix :: funcion();
Matrix :: funcion(var1);


_________________
La Hora Mas oscura es una antes de que Amanesca (Anonimo)

 Perfil  

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Jue Jun 17, 2010 5:23 am
Mensajes: 402
Ubicación: Venezuela

Nota Publicado: Dom Oct 02, 2011 6:37 pm 
Arriba  
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:
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

_________________
[Reglamento del foro] [Blog]

 Perfil  

Desconectado
Forista Mayor
Forista Mayor
Avatar de Usuario

Registrado: Dom Ago 13, 2006 7:00 am
Mensajes: 913
Ubicación: Toronto, Canada

Nota Publicado: Dom Oct 02, 2011 6:49 pm 
Arriba  
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)

 Perfil  

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Jue Jun 17, 2010 5:23 am
Mensajes: 402
Ubicación: Venezuela

Nota Publicado: Dom Oct 02, 2011 9:06 pm 
Arriba  
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

_________________
[Reglamento del foro] [Blog]

 Perfil  

Desconectado
Forista Mayor
Forista Mayor
Avatar de Usuario

Registrado: Dom Ago 13, 2006 7:00 am
Mensajes: 913
Ubicación: Toronto, Canada

Nota Publicado: Dom Oct 02, 2011 9:10 pm 
Arriba  
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)

 Perfil  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 8:00 am
Mensajes: 1457
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Dom Oct 02, 2011 11:21 pm 
Arriba  
Juanp_1982 escribió:
si puedes solo tienes que llamar a la funcion que quieras asi

Código:
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:
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" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  

Desconectado
Forista Mayor
Forista Mayor
Avatar de Usuario

Registrado: Dom Ago 13, 2006 7:00 am
Mensajes: 913
Ubicación: Toronto, Canada

Nota Publicado: Dom Oct 02, 2011 11:38 pm 
Arriba  
akodo escribió:
Juanp_1982 escribió:
si puedes solo tienes que llamar a la funcion que quieras asi

Código:
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:
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)

 Perfil  

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Jue Jun 17, 2010 5:23 am
Mensajes: 402
Ubicación: Venezuela

Nota Publicado: Mar Oct 04, 2011 3:59 pm 
Arriba  
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.

_________________
[Reglamento del foro] [Blog]

 Perfil  
Mostrar mensajes previos:  Ordenar por  
 [ 15 mensajes ] 
Nuevo tema Responder al tema

Saltar a:  


 Temas relacionados   Autor   Respuestas   Vistas   Último mensaje 
Acceder a un metodo en una clase desde otra clase

en Programación

adrianeric

7

10245

Mié Feb 23, 2011 9:21 pm

mcun Ver último mensaje

Instanciar clase padre en clase hija (PHP) (SOLUCIONADO)

en Programación

greer

2

1474

Sab Jul 13, 2013 1:28 am

greer Ver último mensaje

Acceder a impresora en otra red Windows XP

en El Café

taenet

1

1201

Dom Ago 30, 2009 3:12 pm

taenet Ver último mensaje

¿Qué clase de respuesta es esta? [Solucionado]

en Sistema

Arthigus

6

1546

Lun May 24, 2010 8:43 pm

Arthigus Ver último mensaje

Devolver objeto en Clase Coordenadas [SOLUCIONADO]

en Programación

cerenkov

4

1014

Mar Sep 27, 2011 1:30 am

cerenkov Ver último mensaje



¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC + 1 hora [ DST ]
Traducción al español por Huan Manwë
phpBB SEO