Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23
  1. #1

    [C++] Undefinited reference to, perchè?

    Salve a tutti,
    ho una semplcie libreria che sto iniziando ad implementare ora ma mi da l'errore come da titolo (senza nemmeno indicarmi la riga dell'errore) e non riesco a capirne il perchè.

    La libreria è formata da un file .h con le definizioni ed un file .cpp e sono i seguente:

    listap.h
    codice:
    #ifndef _LISTAP_H
    #define _LISTAP_H
    #define N 100		//dimensione del vettore
    typedef struct componenteSpazio
    	{                                
            int elemento;
            int successivo;
            int precedente;
    	} componenteSpazio;
    
    class Lista
      {
      public:
        /* posizione è un puntatore a cella */
        typedef int posizione;
        typedef int tipoelem;
        /* Prototipi degli operatori */
        void crealista();
        static void inizializza_spazio();
        /*bool listavuota() const;
        tipoelem leggilista(posizione) const;
        void scrivilista(tipoelem, posizione);
        posizione primoLista() const;
        bool finelista(posizione) const;
        posizione succlista(posizione) const;
        posizione preclista(posizione) const;
        void inslista(tipoelem,posizione&);
        void canclista(posizione &p);*/
      private:
        static componenteSpazio spazio[N];
        int testa;
      };
    #endif // _LISTAP_H
    listap.cpp
    codice:
    #include "listap.h"
    void Lista::inizializza_spazio()
    {
         int i;
         for(i = 0; i < N; i++)
         {
               Lista::spazio[i].elemento = 0;
               //spazio[i].successivo = 0;
               //spazio[i].precedente = 0;
         }
    }
    void Lista::inizializza_spazio();
    
    
    void Lista::crealista()
    {
    
    }
    L'errore si riferisce sicuramente al file .cpp alla seguente istruzione:

    codice:
    Lista::spazio[i].elemento = 0;
    Questo perchè se lo commento funziona di nuovo tranquillamente.

    Non riesco però a capire dove sia il problema, così di primo acchitto sembra tutto apposto.

    EDIT: Forse crede che quel ".elemento" sia riferito ad un metodo della classe Lista, ma invece si riferisce ad "elemento" appartenente alla struttura componenteSpazio che è il tipo della variabile spazio. Ma a questo punto come faccio a referenziarmi all'elemento della struttura e non ad un metodo della classe?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  2. #2
    Guardando meglio ciò che gli crea problemi è la definizione di "spazio" di tipo static.
    Forse ha bisogno di una qualche inizializzazione che a me però sfugge.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  3. #3
    I campi static, oltre che essere dichiarati nella classe, vanno anche definiti in un .cpp.
    codice:
    componenteSpazio Box::spazio[N];
    Non capisco però perché tu voglia avere quel campo static.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Originariamente inviato da MItaly
    I campi static, oltre che essere dichiarati nella classe, vanno anche definiti in un .cpp.
    codice:
    componenteSpazio Box::spazio[N];
    Non capisco però perché tu voglia avere quel campo static.
    Perchè dalle specifiche dell'algoritmo l'array in cui verranno salvate tutte le liste collegate deve essere sempre lo stesso e ci hanno consigliato di usare un array di tipo statico. E' sbagliato?

    Mettendo la dichiarazione nel .cpp effettivamente non da più errori, ma mettiamo caso che ho un metodo della stessa classe per inizializzarlo che si chiama void init_spazio();, esiste un modo per lanciare l'inizializzazione subito dopo la dichiarazione?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  5. #5
    C'è stato detto di fare anche "l'inizializzatore" di tipo statico in modo da poterlo richiamare semplicemente con un:

    codice:
     Lista::inizializza_spazio()
    Ma non va.

    Ovvero nella classe l'ho dichiarato come
    codice:
    static void init_spazio();
    E nel .cpp ho richiamato il codice di sopra ma dev mi da il seguente errore
    codice:
    38 C:\Users\Neptune\Desktop\Asd\laboratorio\10-11-2010 V.2\Lista con cursori\listap.cpp expected constructor, destructor, or type conversion before ';' token
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  6. #6
    Originariamente inviato da Neptune
    Perchè dalle specifiche dell'algoritmo l'array in cui verranno salvate tutte le liste collegate deve essere sempre lo stesso e ci hanno consigliato di usare un array di tipo statico. E' sbagliato?
    Non che sia sbagliato in sé, io l'avrei fatto in altra maniera.
    Mettendo la dichiarazione nel .cpp effettivamente non da più errori, ma mettiamo caso che ho un metodo della stessa classe per inizializzarlo che si chiama void init_spazio();, esiste un modo per lanciare l'inizializzazione subito dopo la dichiarazione?
    Il C++ non supporta i cosiddetti "costruttori static"; puoi emularne le funzionalità facendo sì che il tuo membro spazio sia di fatto un oggetto che contiene l'array in questione ed è dotato di un costruttore regolare, che verrebbe richiamato correttamente al momento della costruzione di spazio.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Originariamente inviato da MItaly
    Non che sia sbagliato in sé, io l'avrei fatto in altra maniera.

    Il C++ non supporta i cosiddetti "costruttori static"; puoi emularne le funzionalità facendo sì che il tuo membro spazio sia di fatto un oggetto che contiene l'array in questione ed è dotato di un costruttore regolare, che verrebbe richiamato correttamente al momento della costruzione di spazio.
    Ovvero invece di una array di tipo strutturato dovrei dichiarare un array di oggetti?

    Il professore mi ha scritto questo per e-mail:

    codice:
    i membri statici si inizializzano all'esterno della classe
    
    class A{
     static int i;
    };
    
    A::i = 0;
    
    lei deve prevedere all'interno della classe un inizializzatore statico
    della componente spazio, tipo
    
    static inizializza_spazio()
    
    e poi fuori dalla classe invocare
    Ma sinceramente non riesco a capire se si riferice come dici tu ad un array di oggetti o cosa.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  8. #8
    Originariamente inviato da Neptune
    Ovvero invece di una array di tipo strutturato dovrei dichiarare un array di oggetti?
    No, potresti dichiarare una classe che incapsula l'array in questione ed è dotata di un costruttore.
    Questo nel caso generale; dato che nel tuo caso l'inizializzazione non dipende dal particolare elemento, ma è la stessa per ogni elemento, ti basta fare:
    codice:
    componenteSpazio Box::spazio[N]={0};
    Un modo anche più pulito sarebbe dare alla struttura componenteSpazio un costruttore di default che la azzeri:
    codice:
    struct componenteSpazio
    {                                
            int elemento;
            int successivo;
            int precedente;
    
            componenteSpazio()
            {
                    elemento=successivo=precedente=0;
            }
    };
    Tra parentesi, levati l'abitudine dei typedef per le strutture, in C++ non serve.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Originariamente inviato da MItaly
    No, potresti dichiarare una classe che incapsula l'array in questione ed è dotata di un costruttore.
    Questo nel caso generale; dato che nel tuo caso l'inizializzazione non dipende dal particolare elemento, ma è la stessa per ogni elemento, ti basta fare:
    codice:
    componenteSpazio Box::spazio[N]={0};
    Un modo anche più pulito sarebbe dare alla struttura componenteSpazio un costruttore di default che la azzeri:
    codice:
    struct componenteSpazio
    {                                
            int elemento;
            int successivo;
            int precedente;
    
            componenteSpazio()
            {
                    elemento=successivo=precedente=0;
            }
    };
    Tra parentesi, levati l'abitudine dei typedef per le strutture, in C++ non serve.
    Sembra interessante l'idea di dare alla struttura un costruttore di default.
    Ma nella tua sintassi questa inizializzazione viene fatta automaticamente? Ovvero la funzione componenteSpazio() della struttura viene lanciata in automatico o devo essere io, da qualche parte nel mio codice (nel caso dove?) a lanciarla?

    Perchè la typedef in c++ non serve? posso dare direttamente il nome della struttura senza dover ripetere ogni volta "struct" ?

    Inoltre il dato di tipo strutturato se lo creo all'interno della classe, o all'esterno, cambia qualcosa in termini di pulizia del codice? o posso metterlo dove mi è più simpatico?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  10. #10
    Originariamente inviato da Neptune
    Sembra interessante l'idea di dare alla struttura un costruttore di default.
    Ma nella tua sintassi questa inizializzazione viene fatta automaticamente? Ovvero la funzione componenteSpazio() della struttura viene lanciata in automatico o devo essere io, da qualche parte nel mio codice (nel caso dove?) a lanciarla?
    È un costruttore di default, viene invocato automaticamente ogni volta che si crea un'istanza della struttura.
    Perchè la typedef in c++ non serve? posso dare direttamente il nome della struttura senza dover ripetere ogni volta "struct" ?
    Sì. Le struct in C++ sono in tutto e per tutto identiche alle class, tranne che per il fatto che nelle class di default i membri e l'ereditarietà sono private, mentre per le struct sono public.
    Inoltre il dato di tipo strutturato se lo creo all'interno della classe, o all'esterno, cambia qualcosa in termini di pulizia del codice? o posso metterlo dove mi è più simpatico?
    Se il tipo è roba usata solo internamente alla classe (o comunque è qualcosa di strettamente correlato) in linea di massima va tenuto al suo interno. Nel tuo caso, terrei componenteSpazio all'interno di Lista, e se non deve essere esposto come all'esterno lo terrei nella sezione private.
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.