elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / C++ Sobrecarga de un operador por medio de un template? en: 7 Mayo 2017, 22:39 pm
Hola a todos!

Estoy tratando de aprender por mi misma los elementos básicos de C++.
He buscado en la web una respuesta a la siguiente duda, pero no la he hallado.

Quizás este problema no tiene solución.

Es posible traspasar un operador a un template de modo tal que el operador no solamente sea sobrecargado sino que a la vez sea reemplazado por otro, y de ese modo no sea necesario tener que repetir el mismo código solo por cambiar la operación, o sea, algo como esto:

Código
  1. Num operator +(const Num &p1,const Num &p2)
  2. {
  3.    Num erg;
  4. erg.a = p1.a + p2.a;
  5. erg.b = p1.b + p2.b;
  6.    return erg;
  7. }
  8.  
  9. Num operator *(const Num &p1,const Num &p2)
  10. {
  11.    Num erg;
  12. erg.a = p1.a * p2.a;
  13. erg.b = p1.b * p2.b;
  14.    return erg;
  15. }
  16.  
  17. Num operator -(const Num &p1,const Num &p2)
  18. {
  19.    Num erg;
  20. erg.a = p1.a - p2.a;
  21. erg.b = p1.b - p2.b;
  22.    return erg;
  23. }
  24.  
etc....

A continuación les dejo el código. Es uno sencillo del que muchos similares pueden encontrarse en libros y en la web:

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class Num
  6. {
  7. public:
  8.    double a, b;
  9. };
  10.  
  11. Num operator +(const Num &p1,const Num &p2)
  12. {
  13.    Num erg;
  14. erg.a = p1.a + p2.a;
  15. erg.b = p1.b + p2.b;
  16.    return erg;
  17. }
  18.  
  19. int main()
  20. {
  21.    Num num1;
  22. num1.a=1;
  23. num1.b=75;
  24.    Num num2;
  25. num2.a=150;
  26. num2.b=175;
  27.    Num num1und2 = num1 + num2;
  28.  
  29.    cout << "num1 " << "a: " << num1.a << ", b: " << num1.b << endl;
  30.    cout << "num2 " << "a: " << num2.a << ", b: " << num2.b << endl;
  31.    cout << "num1und2 " << "a: " << num1und2.a << ", b: " << num1und2.b << endl;
  32.  
  33.    return 0;
  34. }
  35.  

Ese código me gustaría poder reescribir más o menos como sigue, de modo que sea posible traspasar al templete el operador:

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class Num
  6. {
  7. public:
  8.    double a, b;
  9. };
  10.  
  11. template<operator op> // * Algo por este estilo
  12. Num operator op(const Num &p1,const Num &p2)
  13. {
  14.    Num erg;
  15. erg.a = p1.a op p2.a; // * Donde dice op que sea reemplazado por el operador deseado
  16. erg.b = p1.b op p2.b;   // * Donde dice op que sea reemplazado por el operador deseado
  17.    return erg;
  18. }
  19.  
  20. int main()
  21. {
  22.    Num num1;
  23. num1.a=1;
  24. num1.b=75;
  25.  
  26.    Num num2;
  27. num2.a=150;
  28. num2.b=175;
  29.  
  30.    Num num1und2 = num1 + num2; // * Modificando acá el operador que cambie arriba la operación
  31.  
  32.   cout << "num1und2 " << "a: " << num1und2.a << ", b: " << num1und2.b << endl;
  33.  
  34.    return 0;
  35. }
  36.  

Es posible realizar una hazaña de ese tipo?
2  Programación / Programación C/C++ / C++ OOP constructor implicito - ¿se crea automaticamente un constructor implicit en: 13 Abril 2017, 18:40 pm
Hola a todos!

Tengo una duda de curiosidad.

Dispongo de dos libros diferentes sobre C++. Al revisar el tema constructores plantea uno de ellos que cada clase tiene al menos un constructor. De no definirse uno por quien escribe el código, coloca el compilador un constructor por defecto, o sea: Constructor(){}, automáticamente.

El otro libro, que hasta ahora me ha parecido bastante mejor que el recién señalado, dice que cada clase puede tener ninguno, uno o más constructores. NO dice que el compilador establece, en caso de ausencia plena de uno explícitamente definido, uno implícitamente. De lo contrario, el programa puede funcionar, pero pueden surgir problemas con la inicialización del objeto y en general con el funcionamiento del programa, dado que el sistema de ejecución asume un constructor por defecto.

Así que me he puesto a googlear... Y he visto que en varias partes se sostiene lo mismo que en el primer libro referido.

Ahora bien, no soy novata, pero estoy lejos de ser diestra en C++ OOP.

Sin embargo, hice un experimento, para determinar cuál de ambos puntos de vista, es el correcto.

Escribí un pequeño código de prueba una vez sin y una vez con la declaración explícita de un constructor por defecto.

A continuación el programa con un objeto poco afín al trabajo pero hablador sin haber declarado un constructor:

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class Constuctor
  6. {
  7.    private:
  8. void funktion_work()
  9. { cout << "I have to work... Buhhhh" << endl;  }
  10.  
  11.   protected:
  12. void funktion_lenguagesConstuctor()
  13. { cout << "I can english." << endl;
  14. cout << "I can deutsch." << endl;
  15. cout << "I can espaniol." << endl;
  16. }
  17.  
  18.   public:
  19.  
  20. void funktion_lenguagesConstuctor_public()
  21. {
  22. funktion_lenguagesConstuctor();
  23. }
  24. };
  25.  
  26. int main(int argc, char **argv){
  27.  
  28. Constuctor constructor;
  29. constructor.funktion_lenguagesConstuctor_public();
  30.  
  31. return 0;
  32. }
  33.  

Y a continuación, lo mismo pero con un constructor explícitamente declarado (línea 21):

Código
  1.  
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. class Constuctor
  7. {
  8.    private:
  9. void funktion_work()
  10. { cout << "I have to work... Buhhhh" << endl;  }
  11.  
  12.   protected:
  13. void funktion_lenguagesConstuctor()
  14. { cout << "I can english." << endl;
  15. cout << "I can deutsch." << endl;
  16. cout << "I can espaniol." << endl;
  17. }
  18.  
  19.   public:
  20.  
  21. Constuctor(){}
  22. void funktion_lenguagesConstuctor_public()
  23. {
  24. funktion_lenguagesConstuctor();
  25. }
  26. };
  27.  
  28. int main(int argc, char **argv){
  29.  
  30. Constuctor constructor;
  31. constructor.funktion_lenguagesConstuctor_public();
  32.  
  33. return 0;
  34. }
  35.  
  36.  

Lo que me parece interesante es que el programa resultante es más pesado cuando tiene un constructor explícitamente declarado:

Peso del ejecutable sin constructor declarado: 21472 Bytes
Peso del ejecutable con constructor declarado: 21856 Bytes

La diferencia es de 384 Bytes.

De acuerdo a los pesos del ejecutable  tendría razón el libro que no señala la existencia de un constructor implícito colocado por el compilador y que hasta ahora me ha parecido un libro excelente.

Sin embargo, como ya decía, el otro libro y una gran parte de los textos en google dicen lo contrario.

Estoy confusa...  :-\
Alguien tiene alguna mayor claridad sobre este tema?

Muy agradecida por vuestros comentarios me despido,
Gisi
3  Programación / Programación C/C++ / C++ OOP vectores de clases - como crear un vector de una clase en: 15 Febrero 2017, 15:42 pm
Hola a todos,

hay entre UD. quién pueda ayudarme a resolver el siguiente problema?

Ha buscado en innumerables foros, pero, al parecer resulta ser un tema poco tratado.

El siguiente programa consta de dos clases. Una clase base Person que aloja fname y sname de forma protected. La segunda clase Patient quiere tomar esos valores y alojarlos en un vector (y agrega además el valor edad. Para simplificar el tema, he dejado fuera age.)

La función main() crea un objeto Patient.

Sin embargo, no he logrado capt;ar e imprimir en pantalla esa creación.

Alguien puede ayudarme a corregir el código de modo tal que pueda imprimir en pantalla los resultados?

Acá el código:

Código:

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <stdio.h>
#include <vector>

using namespace std;

class Person
{
protected:
string fname;
string sname;
public:
//   Person(){fname = ' '; sname = ' ';}
~Person(){}

Patient(string names, string namef)
{ sname = names;
fname = namef; }


void setNachname(string names)
    { sname = names; }
    void setVorname(string namef)
    { fname = namef; }

string getVorname() const { return fname; }
string getNachname() const { return sname; }

};

class Patient : protected Person
{
protected:
vector<Person> pDB;
//int age;
public:
Patient(){}
~Patient(){}

vector<Person> GetCopyOfVector()
{ return pDB; }


// Agrega el/los objetos creados al vector de la clase Person.
// Toma el vector por referencia para evitar duplicados.
void patInsert(vector<Person>& pDB)
{
pDB.push_back(pDB);
cout << endl;
}

// Imprime el resultado. Capta al vector de forma const
// para evitar modificaciones del vector.
void printVectorPatient(const vector<Person>& pDB)
{
    int i;
    int size = pDB.size();

    for(i=0; i<size; i++)
    {
cout << "Name Patient: " << pDB[i] << endl;
    }
}
};

int main()
{
// Crea un nuevo objeto.
Patient PatDB("ma", "mo");
PatDB.patInsert(PatDB);
PatDB.printVectorPatient(PatDB);

return 0;
}


Muy agradecida  :D,
Gisi
4  Programación / Programación C/C++ / ¿Consulta sobre C + MySQL, traspaso del resultado de una consulta MySQL a C? en: 6 Abril 2014, 21:31 pm
¡Hola todas y todos!

En el siguiente programa realizo dos consultas MySQL desde C. Como podrán apreciar hago una de ellas muy mal.. A saberl, la primera.

Me gustaría saber de qué modo lograr que la primera consulta sea pasada a la segunda pero no como sentencia misma, sino el resultado de mi consulta. La primera pretende estimar mis horas trabajadas en un determinado mes para devolver un valor numérico de tipo float. Pero en vez de devolver un valor numérico, traspasa toda la gigante e inacabable sentencia.

Obtengo el error:

Código
  1. You have an error IN your SQL syntax; CHECK the manual that corresponds TO your MySQL server version FOR the RIGHT syntax TO USE near 'xxxx', '', 'xxxxxxxx', 'xxx', 'xxx')' at line n

La impresión en pantalla de
Código
  1. printf("Suma horas: %s", sum_horas_mensual);
(sentencia que tengo incluida en mi programa...) resulta ser:

Código
  1. Suma horas: SET @shm := (SELECT SUM(hras_trab) FROM Horas_trabajadas Total WHERE mes='Februar';)

Vale decir, mi error consiste en que no toma el resultado de la suma que debería arrojar SUM (por ejemplo 63) sino el query MySQL completo en toda su gloria y majestad... pero que no me sirve en absoluto.

¿Qué estoy haciendo mal? :huh: :huh: :huh:

Acá el código completo (sin acentos en los comentarios porque aparecen garabatos y alguien puede llegar a sentirse ofendido... sin mi más mínima intensión):

Código
  1. #include "finish_with_error.h"
  2.  
  3. #define n (10) // n = 3. Three decimal points.
  4.  
  5. //Valores que vienen traspasados de otra funcion.                                        
  6. void conectar(char array_fecha_fact[11], char array_fase_trabajada[257], char array_hrs_totales[4], float float_std_lohn, int int_id_empresas){
  7.  
  8.    MYSQL   *conn;            
  9.    char    q[1024],          
  10.            sum_horas_mensual[4];
  11.  
  12.    conn = mysql_init(NULL);  
  13.    mysql_real_connect(conn, "localhost", "fact", "mi_clave_supersecreta_y_supersegura", "facturas", 0, NULL, 0);
  14.  
  15.  //Aca la consulta a MySQL de la que quiero capturar el resultado y en la que hago algo mal.            
  16.    sprintf(sum_horas_mensual, "SET @shm := (SELECT SUM(hras_trab) FROM Horas_trabajadas Total WHERE mes='Februar';)\n");
  17.    printf("Suma horas: %s", sum_horas_mensual);
  18.  
  19.    sprintf(q,"INSERT INTO Facturas(id_fact, fecha, cant_horas, horario, hora_salario, id_empresas) VALUES('', '%s', '%s', 'algo_muy_importante_dice_aca', '%g', '%i')\n", array_fecha_fact, sum_horas_mensual, float_a, int_id_empresas);                              
  20.    mysql_query(conn, q);    
  21.    finish_with_error(conn);    
  22.    mysql_close(conn);        
  23. }  

Bueno, espero que puedan ayudarme...!

Saludos a todas y todos y muy agradecida por sus respuestas.

Gisi

\m/
5  Programación / Programación C/C++ / C + MySQL, traspaso de variables a un query de MySQL en C. [Resuelto] en: 6 Febrero 2014, 22:46 pm
¡Hola a todas las y los genios del lenguaje de Programación en C!

¿Hay alguien que se maneja bien con C + MySQL y ojalá con GTK?

Estoy escribiendo un pequeño programa en C, con interfaz gráfica en GTK que debe insertar datos a una base de datos en MySQL, pero no logro traspasar un valor desde la interfaz gráfica escrita en GTK a un query de MySQL. Creo que ese problema lo podría solucionar resolviendo lo siguiente:

¿Cómo se traspasa en C una variable a un query de MySQL? El código con el que tengo problema es el siguiente:

Código
  1. float nota;
  2. mysql_query(conn, ("INSERT INTO datos (id, alumno_nombre, nota) VALUES(' ', 'alguien', '%g')"), nota);
Definiticamente la forma con la que estoy tratando hacer el traspaso de la variable al query de MySQL está muy mal  :huh:.
En la web no he hallado respuestas satisfactorias.

Espero que alguien pueda orientarme.

Si necesitan el código completo, me avisan. No lo he querido colocar de inmediato para no saturar la página con más información.
¡Saludos y muchísimas gracias a todas y todos los genios en C!

ME HE RESPONDIDO A MI MISMA. ABAJO MI PROPIA SOLUCIÓN.
6  Programación / Programación C/C++ / C programming + GTK: Add two numbers. en: 21 Junio 2013, 19:25 pm
I'm trying to write a program to add two numbers with a graphical interface written in GTK.
My problem is that it fails to recognize the values ​​entered in the text-box, as numbers.

I searched a long time through google, but I have not found an answer. I have found similar problems, but without an appropriate response.

I hope my query is not outside the margins of the forum.

Can anybody help me to solve the problem that I have in the "action_button function"?

Here my program:


#include <gtk/gtk.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
 
#define Length1 3
#define Length2 5
 
GtkWidget *n1, *n2;
GtkWidget *label_sum;
 
//The Callback funktion. Here is the problem:
void action_button(GtkButton *button, gpointer data){
 
    char result_sum;
    float float_n1, float_n2, sum;
 
    float_n1    = (float)(gtk_entry_get_text(GTK_ENTRY(n1)));
    float_n2    = (float)(gtk_entry_get_text(GTK_ENTRY(n2)));
 
    sum = float_n1 + float_n2;
 
    printf(result_sum, "HA - %d", sum);
    gtk_label_set_label((GtkLabel *)label_sum, result_sum);
 
}


//The Interface part. The problem is not here. 
int main(int argc, char *argv[]){
 
     GtkWidget *window, *descr[15], *layout, *button;
 
     gtk_init_check(&argc, &argv);
 
    //Build window.
     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
     gtk_window_set_title(GTK_WINDOW(window), "Calculo de Nota");
     gtk_container_set_border_width(GTK_CONTAINER(window), 0);
     gtk_window_set_default_size(GTK_WINDOW(window), 300, 300);
 
    //Build layout.
     layout = gtk_layout_new(NULL, NULL);
 
    //Build labels, one title and two indicator.
     descr[0] = gtk_label_new("Add two numbers");
     descr[1] = gtk_label_new("Number 1: ");
     descr[2] = gtk_label_new("Number 2: ");
     label_sum  = gtk_label_new("");
 
    //Build text fields.
     n1     = gtk_entry_new();
     n2     = gtk_entry_new();
 
     gtk_entry_set_max_length(GTK_ENTRY(n1), Length1);
     gtk_entry_set_max_length(GTK_ENTRY(n2), Length1);
 
     gtk_entry_set_width_chars(GTK_ENTRY(n1), Length2);
     gtk_entry_set_width_chars(GTK_ENTRY(n2), Length2);
 
    //Build the button.
     button = gtk_button_new_with_label("Calcular");
     //g_signal_connect(button, "clicked", G_CALLBACK(action_button), NULL);
 
    //Insert the widgets into the layout.
     gtk_layout_put(GTK_LAYOUT(layout), descr[0], 10, 10);
     gtk_layout_put(GTK_LAYOUT(layout), descr[1], 10, 50);
     gtk_layout_put(GTK_LAYOUT(layout), descr[2], 10, 90);
     gtk_layout_put(GTK_LAYOUT(layout), n1, 180, 50);
     gtk_layout_put(GTK_LAYOUT(layout), n2, 180, 90);
     gtk_layout_put(GTK_LAYOUT(layout), button, 10, 200);
     gtk_layout_put(GTK_LAYOUT(layout), label_sum, 90, 205);//Widget label for printing result.
 
    //Put the layout into the window.
     gtk_container_add(GTK_CONTAINER(window), layout);
 
     gtk_widget_show_all(window);
     gtk_main();
 
return 0;
 }

I get the following error:
"prog.c: In function ‘action_button’:
prog.c:17:5: error: pointer value used where a floating point value was expected
prog.c:18:5: error: pointer value used where a floating point value was expected
prog.c:22:5: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast [enabled by default]"


What I'm doing wrong?
Thanks for any help.
(Sorry for my bad English. I'm not native speaker.).
Gisi

(Answers could be in Spanish, English or German)
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines