Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Duda con sobrecarga de operadores, estructuras y punteros.

Estas en el tema de Duda con sobrecarga de operadores, estructuras y punteros. en el foro de C/C++ en Foros del Web. Hola, soy nuevo en el foro y también con C++. Quería hacer unas cuantas funciones aparentemente sencillas sobre matemáticas, aunque me he encontrado con errores ...
  #1 (permalink)  
Antiguo 07/10/2014, 13:05
 
Fecha de Ingreso: octubre-2014
Mensajes: 23
Antigüedad: 10 años, 1 mes
Puntos: 0
Duda con sobrecarga de operadores, estructuras y punteros.

Hola, soy nuevo en el foro y también con C++. Quería hacer unas cuantas funciones aparentemente sencillas sobre matemáticas, aunque me he encontrado con errores al empezar.
Adjunto el código:

Código:
#include <iostream>

using namespace std;

template <typename D>
class math
{
    public:
    struct vector{
        D x;
        D y;
        D z;
    };



};

template <typename D>
D & operator + (D & a, D & b)
{
    math::vector<D> d;

    d.x=a.x+b.x;
    d.y=a.y+b.y;
    d.z=a.z+b.z;

    D *ref=d;

    return *ref;
}

int main(void)
{
    math::vector<int> a={2,3,5};
    math::vector<int> b={3,5,6};
    math::vector<int> c;
    c=a+b;

    cout << c.x << "i + " << c.y << "j + " << c.z << "k" << endl;
}
Tengo errores al declarar todos los tipos vector y en las funciones no acabo de tener muy claro como es la sintaxis para pasar estructuras como parámetros o que devuelvan estructuras.

Como proyecto personal me gustaría crear unos módulos que operasen con todo tipo de funciones, polinomios, ecuaciones, etc. Para poder usarlos en simulaciones de física finalmente. Por eso querría preguntar también sobre módulos y funciones para manejar ventanas y gráficos.

Muchas gracias de antemano
  #2 (permalink)  
Antiguo 07/10/2014, 14:58
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Duda con sobrecarga de operadores, estructuras y punteros.

Código C++:
Ver original
  1. template <typename D>
  2. class math
  3. {
  4.     public:
  5.     struct vector{
  6.         D x;
  7.         D y;
  8.         D z;
  9.     };
  10. };

Esa declaración está mal. la clase math es un template... pero eso no se aplica a "vector". Y dado que "x", "y" y "z" pertenecen a vector deberías plantearte hacer que "vector" fuese un template.

Creo que lo que tu estás intentando se parece más a esto:

Código C++:
Ver original
  1. namespace math
  2. {
  3.   template <typename D>
  4.   struct vector{
  5.         D x;
  6.         D y;
  7.         D z;
  8.     };
  9. }

De esta forma, "vector" pasa a formar parte del espacio de nombres "math".

Código C++:
Ver original
  1. template <typename D>
  2. D & operator + (D & a, D & b)
  3. {
  4.     math::vector<D> d;
  5.  
  6.     d.x=a.x+b.x;
  7.     d.y=a.y+b.y;
  8.     d.z=a.z+b.z;
  9.  
  10.     D *ref=d;
  11.  
  12.     return *ref;
  13. }

Lo que pretendes aquí es sumar dos elementos de tipo "vector", luego los parámetros "a" y "b" deberían ser de tipo "vector":

Código C++:
Ver original
  1. template <typename D>
  2. math::vector<D> & operator + (const math::vector<D> & a, const math::vector<D> & b)
  3. {
  4.     math::vector<D> d;
  5.  
  6.     d.x=a.x+b.x;
  7.     d.y=a.y+b.y;
  8.     d.z=a.z+b.z;
  9.  
  10.     D *ref=d;
  11.  
  12.     return *ref;
  13. }

Otro problema que tienes es que el operador no puede devolver una referencia ya que no tienes ningún miembro estático dentro de la función:

Código C++:
Ver original
  1. template <typename D>
  2. math::vector<D> operator + (const math::vector<D> & a, const math::vector<D> & b)
  3. {
  4.     math::vector<D> d;
  5.  
  6.     d.x=a.x+b.x;
  7.     d.y=a.y+b.y;
  8.     d.z=a.z+b.z;
  9.  
  10.     return d;
  11. }

Y creo que con esto ya estaría.

Un saludo.
  #3 (permalink)  
Antiguo 07/10/2014, 15:37
 
Fecha de Ingreso: octubre-2014
Mensajes: 23
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: Duda con sobrecarga de operadores, estructuras y punteros.

Ok, muchas gracias. Me ha servido bastante. :)
  #4 (permalink)  
Antiguo 11/10/2014, 08:51
 
Fecha de Ingreso: octubre-2014
Mensajes: 23
Antigüedad: 10 años, 1 mes
Puntos: 0
Pregunta Respuesta: Duda con sobrecarga de operadores, estructuras y punteros.

Hola, tenía otra duda sobre matrices. El caso es que quería reescribir el código usando matrices.
Código C++:
Ver original
  1. template <class T>
  2. class Matrix {
  3.  
  4.     private:
  5.         T **matrix;
  6.         int filas;
  7.         int columnas;
  8.  
  9.     public:
  10.         Matrix(int m, int n, T **p=0);
  11. };
  12.  
  13. template<typename T>
  14. Matrix<T>::Matrix(int m, int n, T **p)
  15. {
  16.     filas = m;
  17.     columnas = n;
  18.     matrix = new T*[filas];
  19.  
  20.     for (int i = 0; i < filas; i++) {
  21.         matrix[i] = new T[columnas];
  22.     }
  23.  
  24.     if(p!=0){
  25.         for(int i=0; i< filas; i++){
  26.             for( int j=0; j< columnas; j++){
  27.                 matrix[i][j]=p[i][j];
  28.             }
  29.         }
  30.     }
  31. }
  32.  
  33. int main(void){
  34.     Matrix<int> M(4, 4, {{2,2,2,2}, {2,2,2,2}, {2,2,2,2}, {2,2,2,2}});
  35.     return 0;
  36. }


Así se haría para asignar un puntero a un vector no?:
int d[2]={1,4};
int *p=d;

Para el caso de tablas bidimensionales como se escribiría??

Última edición por alexpglez98; 12/10/2014 a las 12:23
  #5 (permalink)  
Antiguo 12/10/2014, 18:10
 
Fecha de Ingreso: octubre-2014
Mensajes: 23
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: Duda con sobrecarga de operadores, estructuras y punteros.

Ok, ya me va, releyendo y probando ya lo conseguí:
me fije que esto funciona:
Código:
int m[i][j];
int *p;
p=&m[0][0];
int a=p[b+a*j]; // equivale a a=m[a][b]

Etiquetas: estructuras, funcion, int, operadores, sobrecarga, vector
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:50.