Problema nella visualizzazione della cout

di il
6 risposte

Problema nella visualizzazione della cout

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

  • Re: Problema nella visualizzazione della cout

    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());
    
  • Re: Problema nella visualizzazione della cout

    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() ?
  • Re: Problema nella visualizzazione della cout

    Oggetto temporaneo che viene distrutto all'uscita al contrario di quella stringa facente parte della classe
  • Re: Problema nella visualizzazione della cout

    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()?
  • Re: Problema nella visualizzazione della cout

    L'oggetto temporaneo viene distrutto e il suo buffer deallocato e utilizzato per altri dati quindi "sporcato" da altro.
  • Re: Problema nella visualizzazione della cout

    Ho capito. Ti ringrazio per i chiarimenti, sei stato molto gentile. Buona serata.
Devi accedere o registrarti per scrivere nel forum
6 risposte