Ver Mensaje Individual
  #8 (permalink)  
Antiguo 04/04/2016, 01:59
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Duda sobre declaración de apuntador

Cita:
Iniciado por enrieto Ver Mensaje
P.D: y por favor, a los aconsejadores compulsivos les voy a pedir que tomen esto como una forma rápida y simple de responder a un par de preguntas, no pretendo hacer una próxima librería para las boost ni espero que nadie vaya a quere ampliar o mantener esto en el futuro, así que por favor no se molesten, cuando necesite un consejo voy a saber pedirlo solito
Más del 90% de las preguntas que se exponen en este foro las realiza gente que está aprendiendo a programar ya que las dudas de más nivel suele acabar en foros tipo stackoverflow (y en inglés para ser más precisos). Dado el gran volumen con un nivel bajo yo, personalmente, veo productivo intentar enseñar buenas prácticas que, todo sea dicho, los profesores suelen omitir, como evitar el uso de variables globales, evitar el uso de using namespace en las cabeceras, controlar los ciclos de vida de la memoria dinámica, entender que los objetos locales se pueden crear en la pila en vez de usar siempre new, las ventajas de usar referencias en vez de punteros y cosas así.

Los comentarios que se hagan sobre tu código no van dirigidos exclusivamente a tí si no a cualquiera que lea el hilo... si se personalizan con tu nombre es debido a comentarios que has realizado al respecto y poco más.

Yo personalmente celebro que seas de la gente que sabe buscarse la vida, pero no por ello has de privar a gente menos preparada que tu del derecho a tener diferentes puntos de vista para poder opinar en el futuro por sí mismos.

Por otro lado y venida a cuenta lo complicado que puede resultar la sintaxis de un puntero a función hemos de saber que tenemos disponible std::function. ¿Ventajas de std::function? Para mi las principales son una sintaxis algo más clara y que no hay que usar punteros, lo cual elimina la ambigüedad de los punteros a función. Además, dado que std::function está bastante optimizado, lo normal es que el overhead al usar dicha función sea nulo o despreciable.

Tampoco penséis que std::function es perfecto. Con funciones sobrecargadas da problemas, aunque hay soluciones para este problema puntual.

Código C++:
Ver original
  1. #include <iostream>
  2. #include <string>
  3. #include <functional>
  4. #include <algorithm>
  5.  
  6. std::string ABinario(int numero)
  7. {
  8.     std::string toReturn;
  9.  
  10.     while( numero != 0 )
  11.     {
  12.       // & es un operador binario. XXXXXXY & 1 = XXXXXXY & 0000001 = Y
  13.       // Es una forma de obtener el bit menos significativo
  14.       int digito = (numero & 1);
  15.      
  16.       // Convertimos
  17.       toReturn += (digito == 1)? '1' : '0';
  18.      
  19.       // Eliminamos el digito que acabamos de procesar
  20.       // desplazando todos los bits a la derecha
  21.       numero >>= 1;
  22.     }
  23.    
  24.     // Es necesario invertir la cadena para que el resultado sea correcto
  25.     std::reverse(toReturn.begin(), toReturn.end());
  26.    
  27.     return toReturn;
  28. }
  29.  
  30. std::string AHexadecimal(int numero)
  31. {
  32.     char tabla[] = "0123456789ABCDEF";
  33.    
  34.     std::string toReturn;
  35.  
  36.     while( numero != 0 )
  37.     {
  38.       // Obtenemos los 4 bits menos significativos
  39.       int byte = (numero & 0xF);
  40.  
  41.       // Convertimos
  42.       toReturn += tabla[byte];
  43.      
  44.       // Eliminamos los 4 bits que acabamos de procesar
  45.       numero >>= 4;
  46.     }
  47.    
  48.     // Como después vamos a invertir la cadena, insertamos la secuencia
  49.     // de inicio en orden inverso.
  50.     toReturn += "x0";
  51.    
  52.     // Es necesario invertir la cadena para que el resultado sea correcto
  53.     std::reverse(toReturn.begin(), toReturn.end());
  54.    
  55.     return toReturn;
  56. }
  57.  
  58. int main()
  59. {
  60.     // function almacenará punteros a funciones que retornan un string
  61.     // y que aceptan un único argumento de tipo int
  62.     // Al ser una clase, por lo que dispone de constructor, no es necesario
  63.     // hacer una inicialización a nullptr para evitar problemas.
  64.     std::function<std::string(int)> func;
  65.    
  66.     func = ABinario;
  67.     std::cout << func(145) << std::endl;
  68.    
  69.     func = AHexadecimal;
  70.     std::cout << func(145) << std::endl;
  71. }

El ejemplo únicamente es compilable a partir del estándar C++11, que data del 2011 para que os hagáis una idea.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.