Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - digimikeh

#71
Tienes razón!... me había preocupado de sobrecargar el operador + y no pensé en las consecuencias, debí haber cargado ademas el operador = y después << para imprimirlo...

La lección que me dio esto es que debo pensar en cada sobrecarga de operador necesaria pues una lleva a la otra...

Gracias
#72
Hola nuevamente:

El siguiente código:

Código (cpp) [Seleccionar]

#include <iostream>

using namespace std;

struct s{
   
private:
    double * d = nullptr;       
   
public:
    s() : d{new double}{}
    ~s(){ if (d != nullptr) delete d; }
    void setd(const double _d){ *this->d = _d; }
    double getd() const { return *this->d; }
   
};

s operator+(const s & _s0, const s & _s1){
    s ns;
    ns.setd(_s0.getd() + _s1.getd());
    return ns;
}

int main(){
   
    s s0;
    s s1;
   
    s s2;
    s2 = s0 + s1;
   
    return 0;
}



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.

#73
Cita de: string Manolo en 17 Junio 2019, 19:49 PM
Mirate el link que te pasé que ahí te viene.

Si, gracias, Lo veo.
#74
Vaya si, me he equivocado al replantear el ejemplo, debi reemplazar x por typeX al final en el cout...


Bueno, comentar que he pasado el argumento por referencia y ahí no me ejecutó el constructor....  lo cual ahora que lo veo bien si es lógico..

de repente es algo confuso saber cuando retornar una referencia o una copia y cuando aceptar un argumento como referencia o como copia en los operadores sobrecargados...

gracias por la ayuda..
#75
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 (cpp) [Seleccionar]


struct x{

private:
     int a;

public:
     x(){ std::cout << "Constructor ejecutado."; }
     ~x() { std::cout << "Deconstructor ejecutado."; }
     inline void setA(const int _a){ this->a = _a; }
     inline int getA() const { return this->a; }
}

std::ostream operator <<(std::ostream & _os, const x _x){
     _os << _x.getA();
     return _os;
}



int main(){

     x typeX;    //Constructor llamado como es usual..
     std::cout << x;     //Constructor y deconstructor llamados, por que?

}


#76
entiendo, entonces es del IDE, no del compilador...
podria salvar varios minutos de compilacion...

llego un momento en que me pregunte : para que rayos tengo que darle un segundo argumento con el error si ya de antemano me lo esta señalando...

gracias por las respuestas.
#77
Gracias por la respuesta...
Entiendo todo lo que has puesto, pero no me había enfocado a eso amigo, sino al comportamiento de MSVS 2017, que me corregía al vuelo el problema que había cuando static_assert() estaba detectando...  esto claramente no es tiempo de compilación, por eso puse "Edito" mas abajo, porque me di cuenta que es una característica de MS y no de GCC (por ejemplo)..

Saludos.
#78
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 (cpp) [Seleccionar]


int main (){
    static_assert(sizeof(int) == 4, "Su sistema no es de 64bits");
    std::cout << "64 bits.";
   
}


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...
#79
1500 dólares... mas los pasajes....
prefiero verme un tutorial o ver diferida la presentación y hacer el sándwich en casa  :silbar: :xD
#80
Que curioso, hice varias pruebas con funciones usando constexpr retornando una variable y siempre me marco error, pero si las cambiaba por literales, entonces funcionaban...


Y ahora que intento recrear la escena, funcionan retornando una variable..

:-\
Una consulta respecto al ultimo trozo de código...
En la línea 11, tienes int x;, pero no esta inicializado, que valor se le pasara a la función ?

saludos y gracias.




Ah!!.. ya vi el por que, pasa que en C++11 las funciones constexpr solo pueden retornar valores (o expresiones) constantes, no variables...

Sin embargo, como bien dices, la versión C++14 si lo puede hacer... debio ser un update del lenguaje...  es que el libro que estoy siguiendo es la versión 11..y precisamente esta usando la version 11 del compilador.

Ya me tenia sin cabello la duda...
Saludos..