|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#21 |
|
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
in realtà l'avevo dichiarato solo in figurina (friend class album) per far si che album potesse usare la classe figurina.. poi per provare l'ho messo avunque lol ma non va
se lo elimino ovunque mi da errore no matching function for call to 'figurina::figurina() |
|
|
|
|
|
#22 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
Esempio: Codice:
// album.h
#include "figurina.h"
#include "vector"
#ifndef ALBUM_H
#define ALBUM_H
class Album {
public:
Album();
Album& Add(const Figurina& figurina);
private:
vector<Figurina> _album;
}
#endif
//album.cpp
#include "album.h"
Album::Album()
{
}
Album& Album::Add(const Figurina& figurina)
{
_album.push_back(figurina);
return *this;
}
Ultima modifica di [Kendall] : 23-05-2012 alle 11:15. |
|
|
|
|
|
|
#23 |
|
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
questo perà utilizzando l STL ma io non posso usarlo, devo allocarlo dinamicamente manualemnte..
ma in ogni caso c'è un errore perchè anche utilizzando vector mi dice: figurina non dichiarata nello scope template argument 1 non valido template argument 2 non valido Ultima modifica di microinfo : 23-05-2012 alle 11:54. |
|
|
|
|
|
#24 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
Fermo restando che non è pensabile per un esercizio crearsi una propria classe che gestisca dinamicamente la crescita dell'album (come fa la STL) in quanto sarebbe assolutamente dispendioso a livello di tempo (visto che devi gestire la crescita dinamica di memoria e non è banale), l'unica altra possibilità è appunto andare sui "semplici" array. Questo comporta che devi preventivamente avere idea del numero massimo di figurine contenibili nell'album (e la cosa può anche starci, pensa per esempio agli album di figurine che acquisti, all'inizio è un insieme definito di spazi liberi nei quali poi andrai ad incollare le figurine acquistate). Posto questo, gli approci sono 2 (che mi vengono in mente), e poniamo per esempio che il numero massimo di figurine sia 200 (per semplicità della spiegazione): 1) Ti crei staticamente ( Figurina _album[200]; ) o dinamicamente ( Figurina* _album = new Figurina[200]; <-- Questo presuppone che nella dichiarazione della classe dichiari un puntatore a figurine, e poi nel costruttore fai puntare quel puntatore ad un array di 200 figurine) l'album di figurine. Il vantaggio dell'usare il puntatore è che puoi decidere a runtime il numero di figurine che costituisce l'album, a differenza del dichiarare direttamente un array (che deve essere dichiarato con una costante). L'aspetto negativo di questo approcio è invece che istanziare Album comporterà sempre l'occupazione di memoria pari a istanziare anche 200 variabili Figurina. 2) Ti crei un vettore di puntatori a Figurina. In questa maniera istanzi solo i 200 puntatori (che solitamente hanno dimensione di 4 byte ognuno) ed eviti di istanziare 200 istanze di Figurina, che sicuramente è ben più corposa a livello di spazio occupato. Li assegni tutti quant a null, inzialmente, e infine a runtime, quando serve, crei una nuova istanza di Figurina e l'assegni a uno dei puntatori. Cosa negativa di questo approcio? Che andrà ad occupare sempre minor memoria, rispetto al caso 1, tranne quando avrai un album completamente riempito, caso nel quale avrai forzatamente 200 istanze anche usando i puntatori, quindi alla fine la memoria occupata sarà la medesima (anzi leggermente superiore visto gli 800 byte utilizzati per i 200 puntatori) rispetto al caso 1. |
|
|
|
|
|
|
#25 |
|
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
la traccia mi dice:
Si realizzi quindi la classe Album, contenente oggetti di tipo Figurina. La classe Album contiene le seguenti variabili membro: .... Num, intero rappresentante il numero di figurine presenti nella collezione A, vettore di elementi di tipo figurina allocato dinamicamente (conterrà tanti elementi quanti indicati da Num) il problema però rimane qui : figurina* valbum; //errore:figurina non è nome del tipo |
|
|
|
|
|
#26 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
|
|
|
|
|
|
|
#27 |
|
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
ti ho inviato un pm, cmq grazie per l'aiuto
|
|
|
|
|
|
#28 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Allora microinfo, io ho trovato questi errori:
1) Nell'header di figurina dovresti eliminare l'include di album.h . Questo perchè facendo in tal modo lui va a leggersi la dichiarazione di album e si ritrova ad utilizzare figurina, una classe che ancora deve definire. Per questo ti dice che figurina non è un tipo (perchè lui in effetti ancora non sa che esiste e come è fatta!). 2) Aggiungi su figurina e sulla sua sottoclasse item dei costruttori di default con nessun parametro. Definendone uno tuo il compilatore non si prende la premura di definirlo più (il costruttore item() e figurina() per intenderci), e questi sono i costruttori utilizzati quando dichiari un array di un tipo definito da te. Poi non vedo altro di rilevante, almeno apparentemente. Prova a fare quelle modifiche e poi dimmi se funziona. |
|
|
|
|
|
#29 |
|
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
scusa non ho capito il punto 2, perchè non mi funziona se definisco il vettore qui?
album::album(char* edit="",char* coll="",int n=0){ editore=new char[strlen(edit)+1]; strcpy(editore,edit); collezione=new char[strlen(coll)+1]; strcpy(collezione,coll); num=n; valbum=new figurina[num]; } |
|
|
|
|
|
#30 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
valbum = new figurina[num] con quale costruttore essi vengono inizializzati? (dato che non specifichi alcun parametro). La risposta sta proprio sul costruttore di default. Non necessitando di alcun parametro è idoneo alla forma utilizzata sopra, e pertanto deve essere specificato. |
|
|
|
|
|
|
#31 |
|
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
cioè intendi dire che visto che non posso non posso dargli un valore di default devo creare il costruttore figurina();
però questo album(char* edit="",char* coll="",int n=0) rimane un altro costruttore di default? e la creazione del vettore dove la faccio? |
|
|
|
|
|
#32 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Il costruttore di default serve solo (per quanto riguarda questo caso) per la classe della quale vuoi creare un array di oggetti, quindi figurina (e relativa classe madre).
Per Album puoi lasciare il costruttore che già avevi messo. |
|
|
|
|
|
#33 |
|
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
ma mi conviene creare una funzione per inizializzare il vettore con new oppure posso farlo nel costruttore? perchè nel costruttore
album::album(char* edit="",char* coll="",int n=0){ editore=new char[strlen(edit)+1]; strcpy(editore,edit); collezione=new char[strlen(coll)+1]; strcpy(collezione,coll); num=n; valbum=new figurina[num]; } mi dice che non trova la referenze figurina::figurina(), ma io i costruttori di default li ho messi sia in padre che in figlio :s |
|
|
|
|
|
#34 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
Es° Codice:
// Point.h
#ifndef POINT_H
#define POINT_H
class Point
{
public:
Point(double x = 0, double y = 0) // anzichè Point(double x, double y)
private:
double x;
double y;
}
#endif
// Point.cpp
#include "Point.h"
Point::Point(double x, double y) //anzichè Point(double x = 0, double y = 0)
{
this->x = x;
this->y = y;
}
|
|
|
|
|
|
|
#35 |
|
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
call of overloaded 'figurina()' is ambiguous album.cpp album::album(char* edit,char* coll,int n){ editore=new char[strlen(edit)+1]; strcpy(editore,edit); collezione=new char[strlen(coll)+1]; strcpy(collezione,coll); num=n; valbum=new figurina[num]; } |
|
|
|
|
|
#36 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
Le possibilità sono 2: 1) mantieni entrambi i costruttori, ma in quello non di default lasci almeno un parametro non specificato (nel senso, almeno nel primo parametro non devi specificare un valore di default) 2) elimini il costruttore di default mantenendo solo quello che avevi prima con i vari parametri, e fai quello che ti ho scritto nel precedente post (cioè invece di specificare i parametri di default nel file di implementazione li specifichi nell'header della classe, cioè nel prototipo del costruttore). |
|
|
|
|
|
|
#37 |
|
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
ah ecco ora funziona, avevi ragione
per finire ho fatto le tre fuznioni richieste nella classe album int &album::operator[](int ind){ if(ind<0 || ind>num) throw bad_access(); return valbum[ind]; } void album::visua_mancanti(){ cout<<"Le figurine mancanti alla collezione sono: "<<endl;; int i; for(i=0;i<num;i++){ if(valbum[i].getpre()==false){ cout<<valbum[i]; cout<<endl;} } } void album::stampa_mancanti(){ int i; fstream f; f.open("dati.txt",ios::out); f<<"Le figurine mancanti sono: "<<endl; for(i=0;i<num;i++){ if(valbum[i].getpre()==false) f<<"La figurina numero: "<<valbum[i]<<endl; } f.close(); } mentre la funzione acquisisce nella classe figurina, non l'ho capita, cioè come faccio a dire se è presente o meno, se il vettore figurine è definitoin album? |
|
|
|
|
|
#38 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
|
|
|
|
|
|
|
#39 |
|
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
io non riesco a capire proprio il testo...
cioè quello che ho capito: //creo tre oggetti figurina figurina f1("pato",3,false,false); figurina f2("lavezzi",4,false,false); figurina f3("totti",10,false,false); //creo al'album che le conterrà (in valbum) album al; //inserisco le figurine nell'album in questo ordine al.valbum[0]=f1; al.valbum[1]=f2; al.valbum[2]=f3; //dato il numero della figurina in ingresso, mi dice se è presente nell'album, oppure se è un doppione f.acquisisci(4); però non capisco l'utilità della funzione acquisici...non dovrebbe prendere in ingresso l'oggetto figurina, e non il numero? ######### void figurina::acquisisci(int x,album a){ int i; for(i=0;i<a.num;i++){ if(a.valbum[i].numero==x) a.valbum[i].doppione=true; else if(a.valbum[i].numero!=x) a.valbum[i].presente=true; } } ######### f.acquisici(2); |
|
|
|
|
|
#40 |
|
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
up
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:25.




















