PDA

Visualizza la versione completa : c++ - array di una classe che contiene figli


formyblackart
21-03-2015, 14:18
ciao a tutti ho il problema seguente:

ho una classe Prodotti, i cui figli sono: prodottiAlimentari e ProdottiNonAlimentari

ereditano e sovra scrivano il metodo ApplicaSconto che varia a seconda delle caratteristiche del determinato prodotto

poi ho una classe lista della spesa alla quale passo un array di Prodotti

ora

nel main vorrei fare cio'

Prodotti lista_spesa[100];

for (i; i < 100; i++)
prezzo += lista_spesa[i].applicaSconto();

ma non usa il metodo sovrascritto delle classi figlie ma quello della classe madre perchè? ce un modo per farlo?

Alex'87
21-03-2015, 14:40
Non sono un esperto di C++ ma mi viene un dubbio: nella superclasse il metodo è segnato come virtuale? Credo che tu te lo sia dimenticato...

formyblackart
21-03-2015, 15:51
dunque io ne so sicuramente meno di te.. ho provato nel .h ad inserire "virtual" davanti al metodo della classe madre ma il risultato non cambia, va a prendere sempre il metodo della classe figlia

Alex'87
21-03-2015, 17:16
ma non usa il metodo sovrascritto delle classi figlie ma quello della classe madre perchè? ce un modo per farlo?


ma il risultato non cambia, va a prendere sempre il metodo della classe figlia

Non ho capito, qual è la cosa che vuoi fare quindi?

formyblackart
21-03-2015, 18:09
devo fare un array di Prodotti che contiene ProdottiAlimentari e ProdottiNonAlimentari in base alle scelte dell'utente, dopo di che per calcolare il totale in un ciclo per ogni Prodotto alimentare o non devo applicargli il relativo sconto, ogni sottoclasse ha il suo applicaSconto() ma quando provo viene applicato il metodo applicaSconto di Prodotti (classe madre) non dell'oggetto contenuto nella poszione i dell'array (alimentari o non)

Alex'87
22-03-2015, 11:04
Fa vedere il codice, così che si capisca meglio quello che hai fatto ;)

formyblackart
22-03-2015, 11:17
MAIN


#include "Prodotti.h"
#include "ProdottiAlimentari.h"
#include "ProdottiNonAlimentari.h"
#include "Date.h"
#include "ListaSpesa.h"

/* time example */
#include <stdio.h> /* printf */
#include <time.h>
#include <iostream>

using namespace std;
using std::string;

int main(int argc, char **argv) {

Date data_1(23, 3, 2015);

Prodotti lista[2];

ProdottiNonAlimentari sapone(34545, "Sapone", 12.24, "cacca");
ProdottiNonAlimentari sapone2(34545, "Sapone2", 100, "vetro");
ProdottiAlimentari brioches(34545, "Biroches", 100, data_1);

cout << sapone.getDescrizione() << " -> " << sapone.getPrezzo() << " euro" << endl;
cout << brioches.getDescrizione() << " -> " << brioches.getPrezzo() << " euro" << endl;

lista[1] = brioches;
lista[0] = sapone2;

cout << lista[0].applicaSconto() << endl;
cout << lista[1].applicaSconto();


// ListaSpesa spesa(lista, false);


//cout << spesa.calcolaTot();

return 0;
}


PRODOTTI




#include "Prodotti.h"

using namespace std;
using std::string;
Prodotti::Prodotti(long _codice_a_barre, string _descrizione, float _prezzo)
{

codice_a_barre = _codice_a_barre;
descrizione = _descrizione;
prezzo = _prezzo;

}

Prodotti::Prodotti(){

}

....

float Prodotti::applicaSconto(){
prezzo = prezzo - (prezzo/20);
return prezzo;
}


PRODOTTI ALIMENTARE (concettualmente NonAlimentari è identico)


#include "ProdottiAlimentari.h"#include "Date.h"
using namespace std;
using std::string;

ProdottiAlimentari::ProdottiAlimentari(long _codice_a_barre, string _descrizione, float _prezzo, Date _scadenza):Prodotti(_codice_a_barre, _descrizione, _prezzo)
{

codice_a_barre = _codice_a_barre;
descrizione = _descrizione;
prezzo = _prezzo;
scadenza = _scadenza;

}

bool ProdottiAlimentari::GetScaduto(){
return scadenza.getScaduto();
}

float ProdottiAlimentari::applicaSconto(){

prezzo = prezzo - ((prezzo*20)/100);

return prezzo;
}

PRODOTTI ALIMENTARI .H


class ProdottiAlimentari: public Prodotti{
public:
ProdottiAlimentari(long _codice_a_barre, string _descrizione, float _prezzo, Date _scadenza);
bool GetScaduto();
float applicaSconto();

protected:
int giorno;
int mese;
int anno;
float prezzo;
Date scadenza;
bool scaduto;
};

Alex'87
22-03-2015, 13:20
applicaSconto della superclasse non è dichiarato virtual. Se vuoi usare applicaSconto() in modo polimorfico ti serve virtual...

Hai detto di averlo messo prima... dove lo avevi inserito?

formyblackart
22-03-2015, 13:23
lo avevo inserito davanti alla dichiarazione del metodo applicaSconto della classe prodotti. come devo fare?

Loading