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

 

 


Tema destacado: Tutorial básico de Quickjs


  Mostrar Temas
Páginas: 1 2 [3] 4 5 6
21  Programación / Programación C/C++ / Error C2662 - const en: 7 Julio 2019, 18:15 pm
Hola amigos..

En el siguiente código, si yo quito la palabra const (línea 52) derivada de un template tipo C, el programa corre....


Link -> https://onlinegdb.com/SyW1F9kWS
Hagan clic en Fork para probar el código.

Estuve buscando por què pasa esto, segun el compilador no pudo realizar una conversion de un tipo que no es const a uno que es const...  entiendo que quitando la palabra const se acaba el problema, pero por que?.. y si no deseo retirar la palabra const donde mas debería agregarla para que pueda compilar?... (Pasa que el libro que estudio aparece con const, ero no veo diferencia realmente con lo que tengo).

Gracias.



Bueno, según un usuario de discord, me dijo que las funciones begin() y end() deben ser const también, y efectivamente colocándolas asi compiló correctamente.

Pero es curioso porque en el libro que estudio, dichas funciones no son const..

Ahora mismo estoy investigando por que´.



Si yo coloco las funciones begin() y end() como funciones no miembro, es decir, fuera de la clase o estructura, el compilador no las detecta...

Lnik -> https://onlinegdb.com/SJgL5ayZH


Debe forzosamente ser funciones miembro?

EI: NO HAGAS DOBLE POST NUEVAMENTE, SERA BORRADO.
22  Programación / Programación C/C++ / asignacion de array dinamico usando una variable no inicializada.. en: 6 Julio 2019, 19:35 pm
Hola amigos. que tal.

Tengo el siguiente caso:
Código
  1.  
  2. #include <iostream>
  3. #include <initializer_list>
  4.  
  5. struct x {
  6. private:
  7.     int * iArray = nullptr;
  8.     int tam;       //Sin inicializar
  9.  
  10. public:
  11.     x(std::initializer_list<int> lst) : iArray{new int[lst.size()}, tam{lst.size()}{
  12.          std::copy(lst.begin(), lst.end(), iArray);
  13.     }
  14.  
  15.     //Constructor de copia
  16.     x(const x & otherX);
  17.  
  18. };
  19.  
  20. //Definición de constructor de copia (notar aquí que al momento de hacer
  21. //la primera inicialización tam no ha recibido valor.
  22. x::x(const x & otherX) : iArray{new int[tam]}, tam{otherX.tam}{
  23.     for (int y = 0; y < tam; ++y){
  24.          iArray[y] = otherX.iArray[y];
  25.     }
  26. }
  27.  
  28. int main (){
  29.     x x0 {2, 4, 6};
  30.     x x1 = x0;   //copia correcta...
  31.  
  32.     //prueba directa de asignacion de una variable no definida a un array dinamico:
  33.  
  34.     int x;
  35.     int * arr = new int[x];     //error, x no está definida.
  36. }
  37.  

Como se puede observar, en la linea 22 se está inicializando el array dinamico con un tamaño de tam antes que inicializar al mismo tam, o sea, se esta inicializando con un valor desconocido...  sin embargo, esta funcionando bien, ahora bien, en la linea 35, se esta intentando crear un array dinamico con un tamaño x, pero no sirvio.... acaso la inicialización funciona distinto a la asignacion?

Gracias, saludos.

23  Programación / Programación C/C++ / Asignaciones e inicializacion de constructores.. en: 22 Junio 2019, 22:05 pm
Buenas..

Me ha causado extrañeza la forma en que se puede inicializar un tipo a traves de un argumento al constructor:

Código
  1. struct s {
  2. private:
  3. int x = 0;
  4. public:
  5. s(int _x) : x{ _x } {}
  6. void p() const { std::cout << x; }
  7. int getx() const { return x; }
  8. };
  9.  
  10. int main() {
  11. s _s(5);                                       //forma argumento a constructor 1
  12. s _t = 6;                                     //forma argumento a constructor 2
  13. s _u{ 7 };                                   //forma argumento a constructor 3
  14. s _v = { 8 };                              //forma argumento a constructor 4
  15.  
  16. std::cout << std::endl;
  17. std::cout << _s.getx() << std::endl; //salida : 5
  18. std::cout << _t.getx() << std::endl; //salida : 6
  19. std::cout << _u.getx() << std::endl; //salida : 7
  20. std::cout << _v.getx() << std::endl; //salida : 8
  21. return 0;
  22. }
  23.  

Siempre he inicializado un tipo (que reciba un argumento de constructor) con los parentesis, es decir, tal como sale en la salida 5, es decir:
Código
  1. s _s(5);
  2.  


Sin embargo, estaba convencido que la siguiente linea solo tenia como fin la asignacion de un valor:
Código
  1. s _t = 6;
  2.  

Me ha parecido curioso porque se supone que una asignacion por regla general debe tener el mismo tipo que el asignado... sin embargo, el tipo s no es un entero.


Entonces me pregunto si esa linea realmente es una asignacion o lleva otro nombre....



24  Programación / Programación C/C++ / Sobrecarga operador+ y miembro puntero... en: 18 Junio 2019, 22:11 pm
Hola nuevamente:

El siguiente código:

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct s{
  6.  
  7. private:
  8.    double * d = nullptr;      
  9.  
  10. public:
  11.    s() : d{new double}{}
  12.    ~s(){ if (d != nullptr) delete d; }
  13.    void setd(const double _d){ *this->d = _d; }
  14.    double getd() const { return *this->d; }
  15.  
  16. };
  17.  
  18. s operator+(const s & _s0, const s & _s1){
  19.    s ns;
  20.    ns.setd(_s0.getd() + _s1.getd());
  21.    return ns;
  22. }
  23.  
  24. int main(){
  25.  
  26.    s s0;
  27.    s s1;
  28.  
  29.    s s2;
  30.    s2 = s0 + s1;
  31.  
  32.    return 0;
  33. }
  34.  
  35.  

Aqui listo para ejecutar:
https://onlinegdb.com/rJNPQ68kr

Al ejecutar, obtengo el mensaje de error:

*** Error in `./a.out': double free or corruption (fasttop): 0x0000000000795c80 ***                                             
Aborted (core dumped)


Estoy seguro que el problema esta entre el puntero privado y el delete en el destructor, ya que si no uso puntero, compila bien.

Sin embargo, he puesto puntero porque quiero entender qué está pasando.  Me da la impresión de que en la definición del operador+ como se crea el objeto ns al terminar el ámbito, se está destruyendo y esta eliminando el puntero.  Lo cual parece valido, pero no tendría por qué corromper la ejecución, se supone que estoy destruyendo un objeto de copia, no los operandos utilizados.

25  Programación / Programación C/C++ / Sobrecarga de operador y constructores/destructores en: 17 Junio 2019, 04:54 am
Hola..

haciendo algunos ensayos, me he encontrado con una sorpresa, cuando intento utilizar algún operador sobrecargado con un tipo propio, se ejecuta el constructor y el destructor al instante.... ej:

Código
  1.  
  2. struct x{
  3.  
  4. private:
  5.     int a;
  6.  
  7. public:
  8.     x(){ std::cout << "Constructor ejecutado."; }
  9.     ~x() { std::cout << "Deconstructor ejecutado."; }
  10.     inline void setA(const int _a){ this->a = _a; }
  11.     inline int getA() const { return this->a; }
  12. }
  13.  
  14. std::ostream operator <<(std::ostream & _os, const x _x){
  15.     _os << _x.getA();
  16.     return _os;
  17. }
  18.  
  19.  
  20.  
  21. int main(){
  22.  
  23.     x typeX;    //Constructor llamado como es usual..
  24.     std::cout << x;     //Constructor y deconstructor llamados, por que?
  25.  
  26. }
  27.  
  28.  
  29.  
26  Programación / Programación C/C++ / El mecanismo de static_assert(); en: 15 Junio 2019, 19:20 pm
Hola !

He llegado al punto de practicar el static_assert(), entiendo ya como funciona y a que se refiere, seria basicamente una afirmacion a la fuerza y evaluada luego, si es falsa entonoces habra un error, si es verdadera, continuara con el programa.

Lo que entiendo (a diferencia de assert()) es que static_assert evalua en tiempo de compilacion, aqui esto no lo entiendo bien, a que se refiere con tiempo de compilacion ?....  mientras escribes el codigo o cuando haces el build?  Si si, entiendo que esta pregunta es absurda, se supone que tiempo de compilacion es cuando haces build, pero lo pregunto por lo siguiente:

Resulta que estoy en Visual Studio 2017, al escribir:

Código
  1.  
  2. int main (){
  3.     static_assert(sizeof(int) == 4, "Su sistema no es de 64bits");
  4.     std::cout << "64 bits.";
  5.  
  6. }
  7.  

No me va ningun error, es decir, todo bien... pero si le cambio el valor 4 por 5, o por cualquier otro, de inmediato VS me lanza un error, y la descripcion del error es justamente el segundo argumento "Su sistema no es de 64bits", esto quiere decir que static_assert esta evaluando mientras escribo el codigo, no cuando hago build..


Esto definitivamente no puede ser ni tiempo de ejecucion, ni tiempo de compilacion, como le podriamos llamar??..


Editado:
Parece que es el compilador de Microsoft el que hace esta verificacion en el tiempo de edicion, GCC parece no tenerla, no sale el error hasta que le doy build...  entonces SI que es en tiempo de compilacion, pero el compilador de MS te ahorra un poco mas de tiempo mostrandote mientras escribes...
27  Programación / Programación C/C++ / constexpr .. alguna analogia que lo explique mas facil ? en: 9 Junio 2019, 17:59 pm
Hola!

"spam"
Por sugerencia de un usuario del foro me he comprado el libro "The C++ Programming Language 4th Edition - Bjarne Strouptup",
"/spam"  (perdón  :laugh:) entonoces he llegado a una parte que empieza a hablar sobre constexpr,  pero aun no entiendo bien su funcionamiento, es decir, es lógico que quiere decir que se pueden crear expresiones constantes, pero no le veo mayor diferencia con la palabra reservada const al menos por ahora....

Lo que llegue a comprender solamente es que no puedo asignarle valores no-constantes a una expresión constante.....  estoy seguro que es constexpr es algo muy muy útil...  alguna luz del para que sirve?

Gracias..
28  Programación / Programación C/C++ / Sobrecarga de operador en: 15 Mayo 2019, 15:54 pm
Hola amigos..

Estoy experimentando con el contenedor set y tengo duda con el operador de sobrecarga que se necesita para meter al contenedor un tipo creado por mi mismo...

Según estuve leyendo y alguien me dijo también que necesito sobrecargar el operador <

Pero este operador menor que, en que forma hace la comparación de elementos?, el contenedor set no permite objetos duplicados, no seria mas lógico sobrecargar == en vez de < para comparar si el elemento ya existe?


29  Programación / Programación General / Patron MVC duda de implementación... en: 14 Mayo 2019, 01:41 am
Hola..

Tengo una duda con el patron de diseño MVC:

Entiendo que todo lo que se refiere a la visual esta en V (View)
Y todo lo que corresponda a la lógica está en C (Controller)
Lo que pertenece a base de datos en M (Model)

Pero no me imagino como pueda organizarse todo esto, aun no entiendo como se separa.. por ejemplo, un botón es una mezcla de V y C, porque no solo es algo visual sino que ejecuta una función, es decir es programación y visual... a menos que la programación de los botones no entre en la capa de Controller...  si es así, qué entra en esta capa?..

Saludos y gracias.
30  Programación / Programación C/C++ / Operador de seleccion -> en variable no puntero.. en: 13 Mayo 2019, 04:33 am
Hola

Me he topado con algo que no había visto antes.. es lo siguiente;

Código
  1. auto director = Director::getInstance();
  2. auto glview = director->getOpenGLView();
  3.  

director no es puntero, porque entonces utiliza el operador -> ?

Gracias
Saludos
Páginas: 1 2 [3] 4 5 6
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines