Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C++] Aiuto Esame

    Salve a tutti. Fra pochi giorni ho un esame di C++ e vorrei chiedervi aiuto per la correzzione di un programma:

    codice:
    //File Rivista.h
    
    #ifndef RIVISTA_H
    #define RIVISTA_H
    
    #include <iostream>
    #include <string>
    #include <vector>
    #include "Data.h"
    
    using namespace std;
    
    class Autore
    {
    public:
    	Autore(string n);
    	string Nome() const { return nome; }
    	private:
    	string nome;
    };
    
    class Articolo
    {
    public:
    	Articolo(string t, int p);
    	string Titolo() const { return titolo; }
    	void AggiungiAutore(Autore* a);
    	int VediPagine() { return pagine; }
    private:
    	string titolo;
    	vector<Autore*> autori;
    	int pagine;
    };
    
    class Fascicolo
    {
    public:
    	Fascicolo(Data d);
    	void AssegnaPagina(Articolo* a);
    	void InserisciArticolo(Articolo* a);
    	int NumArticoli() const { return articoli.size(); }
    	Data VediData() const { return data; }
    	void EliminaArticolo(Articolo* a);
    private:
    	int TrovaArticolo(Articolo* a);
    	int uscita;
    	Data data;
    	vector<Articolo*> articoli;
    	vector<int> pagine_iniziali;
    };
    
    class Rivista
    {
    friend ostream& operator<<(ostream& os, const Rivista& r);
    public:
    	Rivista(string n);
    	string Nome() const { return nome; }
    	bool VerificaPubblicazione(Fascicolo* f);
    	int TrovaFascicolo(Fascicolo* f);
    	void InserisciFascicolo(Fascicolo* f);
    	void EliminaFascicolo(Fascicolo* f);
    private:
    	string nome;
    	vector<Fascicolo*> fascicoli;
    };
    
    #endif
    [CODE]
    //File Rivista.cpp

    #include "Rivista.h"

    Autore::Autore(string n) : nome(n)
    {}

    Articolo::Articolo(string t, int p) : titolo(t)
    {
    pagine = p;
    }

    void Articolo::AggiungiAutore(Autore* a)
    {
    autori.push_back(a);
    }

    Fascicolo::Fascicolo(Data d) : data(d)
    {}

    int Fascicolo::TrovaArticolo(Articolo* a)
    {
    for (unsigned i = 0; i < articoli.size(); i++)
    if(articoli[i] == a)
    return i;
    return -1;
    }

    void Fascicolo::AssegnaPagina(Articolo* a)
    {
    int i = pagine_iniziali.size();
    if(i > 0)
    pagine_iniziali[i] = pagine_iniziali[i-1] + a->VediPagine();
    else
    pagine_iniziali[0] = 1;
    }

    void Fascicolo::InserisciArticolo(Articolo* a)
    {
    articoli.push_back(a);
    AssegnaPagina(a);
    }

    void Fascicolo::EliminaArticolo(Articolo* a)
    {
    int j = TrovaArticolo(a);
    articoli.erase( articoli.begin()+j );
    pagine_iniziali.pop_back();
    for (unsigned i = 0; i < articoli.size(); i++)
    AssegnaPagina(articoli[i]);
    }

    Rivista::Rivista(string n) : nome(n)
    {}

    bool Rivista::VerificaPubblicazione(Fascicolo* f)
    {
    int i = fascicoli.size();
    if ( f->NumArticoli() > 2 && fascicoli[i-1]->VediData() < f->VediData() )
    return true;
    return false;
    }

    void Rivista::InserisciFascicolo(Fascicolo* f)
    {
    assert(VerificaPubblicazione(f));
    fascicoli.push_back(f);
    }

    int Rivista::TrovaFascicolo(Fascicolo* f)
    {
    for(unsigned i = 0; i < fascicoli.size(); i++)
    if(f == fascicoli[i])
    return i;
    return -1;
    }

    void Rivista::EliminaFascicolo(Fascicolo* f)
    {
    int i;
    assert( i == (fascicoli.size() - 1));
    fascicoli.pop_back();
    }

    ostream& operator<<(ostream& os, const Rivista& r)
    {
    os << "La rivista ha pubblicato i seguenti fascicoli: " <<endl;
    for(unsigned i = 0; i < r.fascicoli.size(); i++)
    os << r.fascicoli[i] << " in data: " << r.fascicoli[i]->VediData() << endl;
    return os;
    }

    E qui ecco il main che ho creato per provare quanto sopra riportato:
    codice:
    // File driver_rivista.cpp
    
    #include<iostream>
    #include "Rivista.h"
    
    int main()
    {
    	Rivista r1("Rizzi's Scientifics");
    	Autore p1("Pillin"), p2("Micoli"), p3("Glutine");
    	Articolo a1("Preflop Basics",10), a2("Downswing period",20), a3("Tells",45), a4("Hold'em for Buddies",50);
    	
    	a1.AggiungiAutore(&p1);
    	a1.AggiungiAutore(&p2);
    	a2.AggiungiAutore(&p1);
    	a2.AggiungiAutore(&p3);
    	a3.AggiungiAutore(&p1);
    	a3.AggiungiAutore(&p3);
    	a4.AggiungiAutore(&p1);
    	a4.AggiungiAutore(&p2);
    	
    	Data pubbl1(15,7,2009), pubbl2(15,9,2009), pubbl3(15,12,2009), pubbl4(1,1,2005);
    
    	Fascicolo f1(pubbl1), f2(pubbl2), f3(pubbl3), f4(pubbl4);
    	
    	f1.InserisciArticolo(&a1);
    	f1.InserisciArticolo(&a2);
    	f1.InserisciArticolo(&a3);
    	f2.InserisciArticolo(&a2);
    	f2.InserisciArticolo(&a3);
    	f2.InserisciArticolo(&a4);
    	f3.InserisciArticolo(&a2);
    	f3.InserisciArticolo(&a4);
    	f4.InserisciArticolo(&a1);
    	f4.InserisciArticolo(&a2);
    	f4.InserisciArticolo(&a4);
    	
    	r1.InserisciFascicolo(&f1);
    	r1.InserisciFascicolo(&f2);
    	r1.InserisciFascicolo(&f3);
    	
    	cout << r1 << endl;
    }
    Quando vado ad eseguire il driver_rivista mi dà una marea di undefined references..



    Se qualcuno di voi avrà la pazienza di aiutarmi con questo problema gli sarò molto grato!!!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Di quali errori parli in particolare (elenca i primi tre o quattro)...

    Cosa usi per compilare...?

    Quale tipo di progetto hai creato?

    Quali file hai aggiunto al progetto?



    P.S. Il titolo del thread deve essere adeguato ... vedi regolamento ...
    P.P.S. Per la correzione ... basta una sola z ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Per compilare utilizzo Cygwin e al momento non ho creato nessun progetto.. ho semplicemente creato i 3 file che ho postato sopra ed i file Data.h Data.cpp che posto qui di seguito:

    codice:
    // File Data.h
    #ifndef DATA_H
    #define DATA_H
    #include <iostream>
    
    using namespace std;
    
    class Data
    {
      friend istream& operator>>(istream&, Data&);
      friend ostream& operator<<(ostream&, const Data&);
     public:
      Data(int g, int m, int a);
      Data();
      int Giorno() { return giorno; }
      int Mese() { return mese; }
      int Anno() { return anno; }
      void DataSuccessiva();
      void DataPrecedente();
      void SommaGiorni(int n);
      void Stampa();
      bool operator==(const Data &) const;
      bool operator<(const Data &) const;
     private:
      int giorno;
      int mese;
      int anno;
      bool Valida();
      bool Bisestile();
      int GiorniDelMese();
    };
    #endif
    codice:
    // File data.cpp
    #include "Data.h"
    
    Data::Data(int g, int m, int a)
    {
      giorno = g;
      mese = m;
      anno = a;
      if (!Valida())
        {
          giorno = 1;
          mese = 1;
          anno = 2000;
        }
    }
    
    Data::Data()
    {
      giorno = 1;
      mese = 1;
      anno = 2000;
    }
    
    bool Data::Valida()
    {
      return anno > 0 && anno < 3000 
          && mese > 0 && mese < 13 
          && giorno > 0 && giorno <=GiorniDelMese();
    }
    
    int Data::GiorniDelMese()
    {
      if (mese == 4 || mese == 6 || mese == 9 || mese == 11)
        return 30;
      else if (mese == 2)
        if (Bisestile())
          return 29;
        else
          return 28;
      else 
        return 31;
    }         
    
    bool Data::Bisestile()
    {
      if (anno % 4 != 0)
        return false;
      else if (anno % 100 != 0)
        return true;
      else if (anno % 400 != 0)
        return false;
      else 
        return true;
    }
    
    void Data::Stampa()
    {
      cout << giorno << '/' << mese << '/' << anno << endl;
    }
    
    void Data::DataPrecedente()
    { 
      if (giorno != 1)
        giorno--;
      else 
        if (mese != 1)  
          { 
            mese--;
            giorno = GiorniDelMese();
          }
        else
          { 
            anno--;
            mese = 12;
            giorno = GiorniDelMese();
          }
    }
    
    void Data::DataSuccessiva()
    { 
      if (giorno != GiorniDelMese())
        giorno++;
      else 
        if (mese != 12)  
          { 
            giorno = 1;
            mese++;
          }
        else
          { 
            giorno = 1;
            mese = 1;
            anno++;
          }
    }
    
    void Data::SommaGiorni(int n)
    {
      int i;
      if (n > 0)
        for (i = 0; i < n; i++)
          DataSuccessiva();
      else
        for (i = 0; i < -n; i++)
          DataPrecedente();
    }
    
    bool Data::operator==(const Data &d) const
    {
      return (giorno == d.giorno) && (mese == d.mese) && (anno == d.anno);
    }
    
    bool Data::operator<(const Data &d) const
    {
      return ((anno < d.anno)
          ||  (anno == d.anno && mese < d.mese)
          ||  (anno == d.anno && mese == d.mese && giorno < d.giorno));
    }
    
    istream& operator>>(istream& is, Data& d)
    {
      char ch;
      return is >> d.giorno >> ch >> d.mese >> ch >> d.anno;
    }
    
    ostream& operator<<(ostream& os, const Data& d)
    {
      return os << d.giorno << '/' << d.mese << '/' << d.anno;
    }
    Per compilare il programma tramite Cygwin utilizzo i comandi:

    g++ Rivista.h

    e:

    g++ Driver_Rivista.cpp

    Gli errori sono tutti simili:

    /tmp/ccrevoFB.o:driver_rivista.cpp(.text+0x1b5): undefined reference to 'Rivista::Rivista(std::basic_string<char, std::char_traits<char>, std::allocator<char>>)'

    oppure:

    /tmp/ccrevoFB.o:driver_rivista.cpp(.text+0x7f8): undefined reference to 'Articolo::AggiugiAutore(Autore*)'

    PS: Mi vergogno e chiedo venia per la schifezza della doppia z del messaggio di prima!!

  4. #4
    Ah.. per il cambio del titolo ero troppo tardi e ho contattato l'amministratore via mail.. scusate per l'inconveniente ma era il primo post e ho letto il regolamento un pò di corsa..

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da MrBartowski
    Per compilare utilizzo Cygwin e al momento non ho creato nessun progetto..
    Beh, a parte il fatto che non ha senso compilare da solo un file include (il file Rivista .h ...), è ovvio che se compili i file singolarmente, il compilatore non saprà mai dove sono le varie classi, ecc ...

    Devi usare il compilatore indicando nella linea di comando tutti i file .cpp che servono al tuo progetto ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.