PDA

Visualizza la versione completa : [C++] multiple undefined reference [era: Aiuto Esame]


MrBartowski
12-02-2010, 15:33
Salve a tutti. Fra pochi giorni ho un esame di C++ e vorrei chiedervi aiuto per la correzzione di un programma:



//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




//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:
[CODE]
// 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..

:dh: :dh: :dh:

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

oregon
12-02-2010, 15:46
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 ...

MrBartowski
12-02-2010, 16:59
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:



// 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




// 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!!

MrBartowski
12-02-2010, 17:06
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.. :shy:

oregon
12-02-2010, 18:03
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 ...

Loading