Problema nella visualizzazione della cout

di Anonimizzato28372 il
6 risposte
Salve a tutti, volevo chiedere una dritta su un comportamento che non mi torna. Ho creato una classe, a scopo puramente didattico, per la gestione
di un'eccezione, il problema è che quando vado a stampare a video non riesco a leggere correttamente il testo. Ho provato a cambiare il tipo
ritornato dalla what() da const char* a string rimuovendo il metodo c_str() ed effettivamente riesco a leggere correttamente il testo, ma usando questo codice non riesco ad ottenere lo stesso risultato. Grazie in anticipo.
////////////////////////////////////////////////////////////////////////////////////////////////////
file DivisionePerZero.h

#ifndef INCLUDED_DIVISIONEPERZERO_H
#define INCLUDED_DIVISIONEPERZERO_H

#include<string>

class DivisionePerZero : public std::invalid_argument
{
public:
DivisionePerZero(const char* _messaggio) : invalid_argument{ _messaggio }
{}
DivisionePerZero(std::string _messaggio) : invalid_argument{ _messaggio }
{}
virtual ~DivisionePerZero()
{}
virtual const char* what()
{
return ("Eccezione definita da me: " + std::string(invalid_argument::what())).c_str();
}
};

#endif INCLUDED_DIVISIONEPERZERO_H
//////////////////////////////////////////////////////////////////////////////////////////////////
file Origine.cpp

#include<iostream>
#include"DivisionePerZero.h"

double calcolo(double a, double b)
{
if (b == 0) throw DivisionePerZero{ "Hai diviso per zero!!!" };

return a / b;
}

int main()
{
double n = 0;
try
{
n = calcolo(2.0, 0.0);
}
catch (DivisionePerZero mia_eccezione)
{
std::cout << mia_eccezione.what() << std::endl;
}

std::cout << n << std::endl;

return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////

testo visualizzato:
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦    
0

6 Risposte

  • Usa i tag CODE ... come vedi il codice non si capisce ...

    Comunque .... nella classe aggiungi
    
    private:
       string exmsg;
    
    e poi
    
    exmsg  = "Eccezione definita da me: " + std::string(invalid_argument::what());
    return(exmsg.c_str());
    
  • Ti ringrazio per la risposta, ora funziona correttamente. Posso chiederti perchè c'è la necessità di aggiungere lo step intermedio della variabile nella
    quale salvare la stringa? Scrivere:
    ("Eccezione definita da me: " + std::string(invalid_argument::what()))
    non equivale ad un oggetto temporaneo di tipo stringa sul quale posso di conseguenza usare il metodo c_str() ?
  • Oggetto temporaneo che viene distrutto all'uscita al contrario di quella stringa facente parte della classe
  • Prima di essere distrutto però il risultato del metodo c_str() non verrebbe passato per copia al main e quindi copiato nel relativo oggetto temporaneo
    creato per il contenimento del risultato del metodo what()?
  • L'oggetto temporaneo viene distrutto e il suo buffer deallocato e utilizzato per altri dati quindi "sporcato" da altro.
  • Ho capito. Ti ringrazio per i chiarimenti, sei stato molto gentile. Buona serata.
Devi accedere o registrarti per scrivere nel forum
6 risposte