Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di edriv
    Registrato dal
    Oct 2004
    Messaggi
    367

    [C++] Problema di linking

    Ho fatto la seguente classe per un tipo di eccezioni (ditemi se qualcosa non va bene):
    codice:
    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'
    I've got a bike. You can ride it if you like.

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    I membri statici nelle classi sono solo dichiarazioni: li devi inizializzare fuori dalla classe. In parole povere fuori dalla classe ci devi mettere:
    codice:
    xprException::ErrorMessage = //bla bla bla quello che deve essere

  3. #3
    Utente di HTML.it L'avatar di edriv
    Registrato dal
    Oct 2004
    Messaggi
    367
    Edit...
    ora che sto studiando Java mi sto confondendo tantone!
    I've got a bike. You can ride it if you like.

  4. #4
    Utente di HTML.it L'avatar di edriv
    Registrato dal
    Oct 2004
    Messaggi
    367
    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
    I've got a bike. You can ride it if you like.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    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.

  6. #6
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    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?

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.