2015-05-16 12 views
6

In un programma C++ ho un codice per stampare un oggetto di una classe chiamata frazione. Le sue variabili sono n (il numeratore), d (il denominatore) e il sinale (segnale: vero quando una frazione è positiva e falsa altrimenti).iomanip con un oggetto di una classe

ostream &operator << (ostream &os, const fraction &x){//n=0 

    if(!x.sinal) 
     os << "-"; 

    os << x.n; 

    if(x.d!=1 && x.n!=0) 
     os << "/" << x.d; 

    return os; 
} 

Si fa un buon lavoro, ma quando provo ad usare un setw() in esso, non funziona correttamente: colpisce solo il primo oggetto da stampare (se è il segnale o il numeratore).

Ho provato a cambiare e la soluzione che ho trovato è stato il primo a convertirlo in una stringa e quindi utilizzando il sistema operativo con un iomanip:

ostream &operator << (ostream &os, const fraction &x){//n=0 

    string xd, xn; 

    stringstream ssn; 
    ssn << x.n; 
    ssn >> xn; 

    stringstream ssd; 
    ssd << x.d; 
    ssd >> xd; 

    string sfra = ""; 

    if(!x.sinal) 
     sfra += "-"; 

    sfra += xn; 

    if(x.d !=1 && x.n != 0){ 
     sfra += "/"; 
     sfra += xd; 
    } 

    os << setw (7) << left << sfra; 

    return os; 
} 

Questo funziona, ma ovviamente io non sono in grado di cambiare la larghezza che avrà una frazione: sarà 7 per tutti loro. C'è un modo di cambiarlo? Ho davvero bisogno di usare diverse larghezze per diverse frazioni. Grazie in anticipo.

risposta

1

Questo perché, come da https://stackoverflow.com/a/1533752, lo width dell'output viene reimpostato esplicitamente per ogni output formattato.

Quello che si può fare è all'inizio della funzione ottenere la larghezza corrente, ovvero la larghezza impostata da std::setw (o correlata), quindi impostare questa larghezza esplicitamente per ogni valore in cui si desidera applicare e utilizzare std::setw(0) per ogni valore che si desidera in uscita così com'è:

ostream &operator << (ostream &os, const fraction &x) 
{ 
    std::streamsize width = os.width(); 

    if(!x.sinal) 
     os << std::setw(width) << "-"; 
    else 
     os << std::setw(width); // Not necessary, but for explicitness. 

    os << x.n; 

    if(x.d!=1 && x.n!=0) 
     os << "/" << std::setw(width) << x.d; 

    return os; 
} 

Ora è necessario migliorare su questo un po 'per gestire padding a destra ea sinistra; questo gestisce solo il riempimento sinistro.

+0

Questo è sorprendente! Grazie mille. – ahgert

Problemi correlati