Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Miseryk en 20 Diciembre 2013, 15:39 pm



Título: [RESUELTO] FUNCIONES GLOBALES CLASS
Publicado por: Miseryk en 20 Diciembre 2013, 15:39 pm
Hola a todos, me estaba preguntando cómo podría hacer yo una clase que tenga funciones globales, y que a su vez permita templates ej:

MiClase::Mensaje("hola"); //función común

//Template
a y b = int
MiClase::Suma(a, b);

a y b = float
MiClase::Suma(a, b);

No sé si es mejor una clase o un namespace, para mi es todo de lo mismo *-)

Desde yá muchas gracias.


Título: Re:
Publicado por: ivancea96 en 20 Diciembre 2013, 16:19 pm
Template<class T> MiClase(T a, T b);

Así?

Enviado desde mi ST21i mediante Tapatalk


Título: Re: [AYUDA] FUNCIONES GLOBALES CLASS
Publicado por: Miseryk en 20 Diciembre 2013, 16:55 pm
En realidad estoy buscando algo extremadamente fácil que podía hacer en VB6 que era como declarar un módulo y llamarlo así:

Module1.Función()

Algo así, que la clase tenga solamente funciones y variables globales para llamar desde cualquier lado, como RandomNumber, Suma, Resta, blabla, pero no puedo hacerlo funcionar con template<typename T> T Suma(T a, T b) por ejemplo, porque cuando trato de compilar me tira errores que ni idea que són...

Si tengo la estrucura en el .h, al escribirlo en el .cpp se llama sólo? cómo funciona?

Ej:
Tengo GlobalMisery.h y GlobalMisery.cpp

Yo estoy en main.cpp

Si hago un include a GlobalMisery.h, se llama a su vez a GlobalMisery.cpp?

Porque en ese cpp tengo el código de la estructura del .h

El tema de punteros está todo muy lindo, pero con este tema de templates es horrible, yo no lo puedo hacer funcionar :(


Título: Re: [AYUDA] FUNCIONES GLOBALES CLASS
Publicado por: xaps en 20 Diciembre 2013, 17:37 pm
Al usar templates has de incluir la implementación desde la cabecera de la clase añadiendo #include "tu_cpp.cpp" al final de tu archivo de cabecera.
Otra opción es la de tener la cabecera y la implementación en el mismo fichero, pero no lo recomiendo si el código es muy extenso.

Saludos


Título: Re: [RESUELTO] FUNCIONES GLOBALES CLASS
Publicado por: Miseryk en 20 Diciembre 2013, 19:00 pm
Traté de hacerlo todo en el .h, pero es una basura, hay cosas que no se pueden pisar, como las variables static (al menos yo no pude, y lo intenté mucho y busqué mucho en internet, todos siguen la lógica de usar el .cpp....)

PERO PUDE LOGRARLO!

Código
  1. ////////////////////////////////////////////////////////////////////////////////
  2. // Filename: GlobalMisery.h
  3. ////////////////////////////////////////////////////////////////////////////////
  4. #ifndef _GLOBALMISERY_H_
  5. #define _GLOBALMISERY_H_
  6.  
  7. ////////////////////////////////////////////////////////////////////////////////
  8. // Class name: GlobalMiseryClass
  9. ////////////////////////////////////////////////////////////////////////////////
  10. class GlobalMiseryClass
  11. {
  12. public:
  13. static int Mier**;
  14.  
  15. GlobalMiseryClass();
  16. ~GlobalMiseryClass();
  17.  
  18. template<typename T> static void deleten(T *&ptr)
  19. {
  20. delete ptr;
  21. ptr = 0;
  22. }
  23.  
  24. template<typename T> static T Suma(T a, T b)
  25. {
  26. return a + b;
  27. }
  28. };
  29.  
  30. #endif
  31.  

Código
  1. ////////////////////////////////////////////////////////////////////////////////
  2. // Filename: GlobalMisery.cpp
  3. ////////////////////////////////////////////////////////////////////////////////
  4. #include "GlobalMisery.h"
  5.  
  6. //Necesito esta mier** para que compile...
  7. int GlobalMiseryClass::Mier** = 0;
  8.  
  9. GlobalMiseryClass::GlobalMiseryClass()
  10. {
  11.  
  12. }
  13.  
  14. GlobalMiseryClass::~GlobalMiseryClass()
  15. {
  16.  
  17. }
  18.  

Código
  1.          #include "GlobalMisery.h"
  2.  
  3. ...
  4.  
  5.         int* a = new int;
  6.  
  7. GlobalMiseryClass::deleten(a);
  8.  
  9. GlobalMiseryClass::Mier** = 3;
  10.  
  11.          int b;
  12. int c;
  13. int d;
  14.  
  15. b = 1;
  16. c = 2;
  17.  
  18. d = GlobalMiseryClass::Suma(b, c);
  19.  

Gracias por el aporte (Y).