Ho notato ora la traccia dell'esercizio, nella quale si chiede: "Definisci una classe libro contenete i seguenti attributi: nome del libro (array di caratteri) [...]". A quanto pare, quindi, non dovresti usare gli oggetti string, bensì dei semplici array di char.
Potresti cominciare col predisporre una proprietà costante tipo kLMaxStringa che definisca le dimensioni massime delle stringhe per l'editore e per il titolo.
static const int kLMaxStr = 127; // 127 e' un valore arbitrario, puoi
// sostituirlo con quel che ti pare, purche'
// si tratti di una quantita' di caratteri
// sufficiente a contenere il titolo/editore
// piu' lungo che pensi possa essere usato
Le due proprietà editore e titolo saranno array di caratteri in grado di contenere stringhe lunghe al massimo kLMaxStr char.
char editore[kLMaxStr+1]; // +1 per far spazio al terminatore '\0'
char titolo[kLMaxStr+1]; // +1 per far spazio al terminatore '\0'
A quel punto, potresti mettere nel metodo inizializza() qualcosa tipo...
bool inizializza( const char *_editore, const char *_titolo,
float _prezzo, float _sconto, int _scaffale, int _pagine ) {
if( !_editore || !_titolo || 0.0f>_prezzo || 0.0f>_sconto || 0>_pagine )
return false; // hai visto mai che vengano passati parametri pazzi?
/* usare strncpy() anziche' strcpy() da' la garanzia di non sfondare
** l'array; in caso di troncamento della stringa, strncpy() non aggiunge
** il terminatore, per cui (per quel che costa) apponiamo sempre e comunque
** un terminatore nell'ultimo char */
strncpy( editore, _editore, kLMaxStr );
titolo[kLMaxStr] = '\0';
strncpy( titolo, _titolo, kLMaxStr );
editore[kLMaxStr] = '\0';
prezzo = _prezzo; // il prezzo non scontato
sconto = _sconto; // per memorizzare la percentuale dello sconto
scaffale = _scaffale;
pagine = _pagine;
return true;
}
Lo sconto non lo applicherei modificando la proprieta' prezzo, bensì facendo in modo che applica_sconto() restituisca il prezzo scontato calcolandolo "al volo":
float applica_sconto() const { return prezzo-prezzo*sconto*0.01f; }