PDA

Visualizza la versione completa : [C++] Problema di linking


edriv
15-12-2004, 20:06
Ho fatto la seguente classe per un tipo di eccezioni (ditemi se qualcosa non va bene):


class xprException
{
// Codice dell'errore
unsigned int errCode;
// Lista dei messaggi di errore.
// errorMessages[x] sarà il messaggio dell'errore numero x.
static myVector<string> errorMessages;
// Serve un inizializzatore perchè non posso inizializzare un membro statico con degli oggetti (string)
static void loadExceptions()
{
errorMessages.add("La divisione 0/0 restituisce un valore indeterminato.");
errorMessages.add("Una divisione per 0 non ha significato.");
}
public:
// Si può lanciare un'eccezione solo specificando il codice di errore.
// Costruttore:
xprException(unsigned int _errCode)
{
loadExceptions();
if(_errCode >= errorMessages.getSize())
throw string("Eccezione: vuoi lanciare un'eccezione che non esiste! Allora sei una banana in pigiama!");
errCode = _errCode;
}
// Inseritore, serve per scrivere la funzione.
friend ostream &operator<<(ostream &stream, xprException toShow);
};

// Amica di xprException, non membra per motivi pratici.
ostream &operator<<(ostream &stream, xprException toShow)
{
stream << "Si e' verificato l'errore " << toShow.errCode << "!" << endl;
stream << errorMessages[toShow.errCode];
}


Perchè mi dà un errore di linker?
[Linker error] undefined reference to `xprException::errorMessages'

pprllo
15-12-2004, 20:21
I membri statici nelle classi sono solo dichiarazioni: li devi inizializzare fuori dalla classe. In parole povere fuori dalla classe ci devi mettere:


xprException::ErrorMessage = //bla bla bla quello che deve essere

edriv
21-12-2004, 14:14
Edit...
ora che sto studiando Java mi sto confondendo tantone! :fagiano:

edriv
27-12-2004, 19:39
Ho risolto ma ho un altro problema: come (quando?dove?) inizializzo un membro (oggetto) statico della classe?

Altro modo per dire: come riempio di stringhe "static myVector<string> errorMessages" ?

Se uso il metodo add() nel costruttore, mi aggiunge gli stessi elementi ogni volta! Come faccio ad eseguirlo solo alla costruzione del primo oggetto?

Grazie :ciauz:

pprllo
27-12-2004, 22:06
Hai 2 possibilità:
Nel costruttore controlli se il vettore è vuoto prima di riempirlo (consigliata)
Fai un metodo statico Init che lanci prima di poter utilizzare la classe.

anx721
27-12-2004, 22:09
Anche per distruggere membri statici la prassi è quindi quella di creare un apposito metodo statico per deallocare la memoria, da richiamare all'uscita del programma?

Loading