Costruttore Classe Figlia

di il
2 risposte

Costruttore Classe Figlia

Ciao a tutti ragazzi
ho un problemino :

ho un main che ha il seguente oggetto :
Ordinazione * o = new OrdinazioneDomicilio  (1 ,2 , "panino " , "via roma ") 
// 1 == codice , 2 == prezzo , "panino" == descrizione , "via roma" == domicilio ; 
adesso io devo implementare il costruttore di OrdinazioneDomicilio

le due classi si differenziano per un solo parametro , ovvero il domicilio ;
class Ordinazione
{
public : 
	Ordinazione (int _code = 0 , int _price = 0 , string _description = "NoDescription") : code (_code) , price (_price) , description (_description)  {} 
//(int _code = 0 , int _price = 0 , string _description = "NoDescription") : code (_code) , price (_price) , description (_description)  {} 
	int getCode () const {return code ; }
	int getPrice ()const  {return price ; }
	string getDescription () const  {return description ; }
	void setCode (int _code) { code = _code ; }
	void setPrice (int _price ) { price = _price ;} 
	void setDescription (string _description ) { description = _description ; }
friend ostream & operator << (ostream & out , const Ordinazione & o ) 
{
	out << o.code << " " << o.price << " " << o.description << "\n" ; 
	return out ; 
}
protected : 
	int code ; 
	int price ; 
	string description ; 
la classe OrdinazioneDomicilio eredita in modo pubblico da Ordinazione , il problema è che vorrei poter sfruttare il costruttore della classe madre per costruire l'oggetto della classe figlia .
come posso fare?
il primo pensiero era quello di rendere il costruttore virtuale puro ma il problema è che , credo , non si possa fare ;
ho provato anche a passare al costruttore di OrdinazioneDomicilio gli stessi parametri della classe madre ma riscontro degli errori in quanto non ho gli stessi parametri dichiarati all'interno della classe figlia (perchè dovrei farlo se sono già dichiarati all'interno della classe madre ? )
il che fa sorgere spontaneamente una domanda : devo dichiarare gli stessi parametri all'interno della classe figlia o c'è un'altra soluzione ?

mi rendo conto che il discorso è un po logorroico e ridondante ma confido nella vostra pazienza ;
grazie a chi risponderà

2 Risposte

  • Re: Costruttore Classe Figlia

    Per chiamare il costruttore della classe base si fa cosi':
    
    #include <iostream>
    
    class A {
    public:
        A(int i, float f) {
            std::cout << "A(i,f)" << std::endl;
        }
        ~A() {
            std::cout << "~A()" << std::endl;
        }
    };
    
    class B : public A {
    public:
        B(double d): A(1, 0.1f) {
            std::cout << "B(d)" << std::endl;
        }
        ~B() {
            std::cout << "~B()" << std::endl;
        }
    };
    
    int main() {
        std::cout << "Hello, World!" << std::endl;
    
        B b(1.0);
    
        return 0;
    }
    
    Pero' il tuo problema e' un'altro: SEI SICURO che l'architettura a cui hai pensato abbia senso?

    C'e' una regoletta non scritta che si deve seguire quando si progettano gli oggetti che servono per l'applicazione, regoletta assolutamente spannometrica, cioe' di pratica spicciola: i vari oggetti devono essere come i mattoncini del Lego, cioe' si devono poter comporre in tutti i modi possibili.

    Se fai un oggetto troppo complicato, questo diventa poco flessibile, fa troppe cose, e non puo' essere riutilizzato.

    Ora tu hai Ordinazione e vuoi realizzare OrdinazioneDomicilio:
    1) non si capisce la differenza tra le due classi visto che anche Ordinazione ha il 'domicilio' (c'e' nei tuoi comenti)
    2) ci sono DUE concetti con cui hai a che fare
    2.1) CHE COSA ordinare
    2.2) DOVE portare l'ordinazione

    Quindi, PROBABILMENTE, ti servono TRE classi:

    1) la classe per indicare CHE COSA ordinare
    2) la classe per indicare DOVE portare l'ordinazione
    3) la classe AGGREGATORE che mette assieme le due classi precedenti
  • Re: Costruttore Classe Figlia

    Ciao migliorabile , un GRAZIE enorme .
    innanzi tutto grazie per avermi risposto e mi scuso per le circa 13 ore di ritardo per controbattere .
    capisco i consigli che mi hai dato e li apprezzo davvero . Ci tengo a precisare che quello che ho scritto non è un mio progetto ma è una parte della traccia di un esercizio che mi bloccava .
    La struttura della classe madre è data ( in pratica io non devo aggiungere e togliere funzioni ma devo solo implementare i metodi di cui ho bisogno )

    per quanto riguarda quello che hai detto ti devo spiegare la modalità d'esercizio :
    a me viene dato un main , in base al quale io vedo le variabili e i metodi che sono utilizzati e da li devo capire come implementare i metodi delle classi menzionate all'interno di esso

    la differenza c'è proprio sul domicilio (Ordinazione ha 3 parametri : codice , prezzo e descrizione ) , mentre OrdinazioneDomicilio ha un parametro in più ovvero la via della consegna . ripeto è pur sempre una traccia di esercizio (oltretutto non scritta da me) .

    fatta la puntualizzazione dell'esercitazione rispondere alle successive domande perderebbe di valore . in quanto non è un progetto vero e proprio .

    per quanto riguarda il riutilizzo del codice hai perfettamente ragione e condivido in pieno ma in questo caso specifico non è un punto cruciale dell'esercizio

    un' altra cosa che mi manda in palla è vedere questo:
    Madre * m = new Figlia (paramentro 1 , parametro 2) 
    ma credo che continuare a parlarne sotto questo titolo sia off-topic , forse dovrei aprire un'altra discussione .

    comunque ho fatto come mi hai suggerito e l'esercizio adesso va grazie di nuovo
Devi accedere o registrarti per scrivere nel forum
2 risposte