Implementazione gerarchia e lettura diagramma UML

Programmazione

xjokerx

Salve a tutti ragazzi! Spero possiate aiutarmi. Allora dovrei scrivere un codice in cui implemento una gerarchia data da un diagramma UML in c++ e poi eseguire 3 punti richiesti dall’esercizio. Ora il mio problema è il seguente: come devo implementare questa gerarchia? C’è da dire che la sto studiando proprio in questi giorni ma volevo già provare la prova d’esame di laboratorio e spero che qualcuno possa indirizzarmi per capire al meglio come farla.
Vi lascio il link all’esercizio: http://www.dmi.unict.it/~messina/didat/prog1_18_19/prove_lab/15_02_2019/esameLab_A_web.pdf
Grazie anticipatamente


Inviato da iPhone tramite App ufficiale di Tom\'s Hardware Italia Forum
 
#1

Andretti60

Utente Èlite
Come da regolamento, devi prima pubblicare il tuo tentativo, anche se sbagliato e incorretto.
 
Mi Piace: Mursey
#2

xjokerx

Ciao, il mio problema è proprio fare il mio tentativo, nel senso che sto studiando ora l'ereditarietà, ma la cosa ancora meno chiara è come leggere lo schema UML.
 
#3

_Achille

Utente Èlite
xjokerx ha detto:
Ciao, il mio problema è proprio fare il mio tentativo, nel senso che sto studiando ora l'ereditarietà, ma la cosa ancora meno chiara è come leggere lo schema UML.
Ti chiede di costruire una classe astratta A e due classi B e C che ereditano da essa, in cui C è una classe template. foo(...) è pure virtual in A.
Il resto è implementazione dei metodi descritti.
 
Mi Piace: Andretti60
#4

Andretti60

Utente Èlite
C’è ben poco da studiare uno schema UML, che è solo una rappresentazione simbolica di oggetti per renderne la descrizione più compatta.
Piuttosto visto che solo adesso stai studiando l'ereditarietà la vedo difficile che tu riesca a fare questi esercizi.
 
Mi Piace: _Achille
#5

xjokerx

Invece devo riuscirci, settimana prossima ho esame di laboratorio e devo fare un esercizio del genere, basterebbe implementare la gerarchia e il primo punto dell’esercizio per passare l’esame, ma tanto meglio se riesco a fare anche il resto. Per esempio nella classe A di quell’esercizio postato prima nei metodi ho +A(m:short) e di lato dice che m sono gli elementi di w ed il valore di m sta in len, ma quindi m lo scelgo io? Perché non trovo da nessuna parte dove stia questo valore e se non do un valore il compilatore ovviamente da errore..
 
#6

_Achille

Utente Èlite
xjokerx ha detto:
Invece devo riuscirci, settimana prossima ho esame di laboratorio e devo fare un esercizio del genere, basterebbe implementare la gerarchia e il primo punto dell’esercizio per passare l’esame, ma tanto meglio se riesco a fare anche il resto. Per esempio nella classe A di quell’esercizio postato prima nei metodi ho +A(m:short) e di lato dice che m sono gli elementi di w ed il valore di m sta in len, ma quindi m lo scelgo io? Perché non trovo da nessuna parte dove stia questo valore e se non do un valore il compilatore ovviamente da errore..
A è una classe, e come classe ha un costruttore. +A(m:short) non è che la richiesta di implementare il costruttore che prende un parametro short.
 
#7

xjokerx

Ho provato a scrivere un pò di codice, il compilatore segna parecchi errori in corrispondenza della classe c ancora prima di compilare, vi lascio il link se gentilmente potete dargli un'occhiata: https://pastebin.com/4nRzUX6V

Ho solo implementato la gerarchia e creato il main con il generatore casuale di numeri datomi dall'esercizio stesso, ora dovrei provvedere a fare l'overloading dell'operatore << per visualizzare la collezione creata tramite il generatore giusto?
 
#8

_Achille

Utente Èlite
xjokerx ha detto:
Ho provato a scrivere un pò di codice, il compilatore segna parecchi errori in corrispondenza della classe c ancora prima di compilare, vi lascio il link se gentilmente potete dargli un'occhiata: https://pastebin.com/4nRzUX6V

Ho solo implementato la gerarchia e creato il main con il generatore casuale di numeri datomi dall'esercizio stesso, ora dovrei provvedere a fare l'overloading dell'operatore << per visualizzare la collezione creata tramite il generatore giusto?
- A non è astratta. Manca il pure virtual come già riferito.
- A crea un array statico all’interno del costruttore invece di un array dinamico da affidare a w
- L’inizializzazione in un costruttore avviene con
C++:
TypeA A;
TypeB B;
 
cctor(TypeA a, TypeB b)
    : A(a), //o
    B{b}
{ }
Nessuno vieta di chiamare altre funzioni nell’inizializzazione, come malloc, new, make_unique (tutta roba che fa al caso...)
- getLen() fa quello che le pare...
- w, (membro in A) è private invece di protected e non accessibile alle figlie
- template < class C : public A, typename T >, si dichiara così una classe template?
- se noti c’è una differenziazione tra short e double per C. Bisogna quindi specializzare...
 
Ultima modifica:
#9

xjokerx

Ciao, allora ho provveduto a spostare il double *w nel protected, credo di aver anche modificato l'array in modo da renderlo dinamico, ho inizializzato la variabile virtuale a 0 (almeno da quello che ho capito una classe si definisce astratta quando c'è una variabile virtual, e per essere pure virtual non deve avere implementazione ma solo la dichiarazione ed essere inizializzata a 0), ho anche corretto la dichiarazione della classe template (l'avevo scritta in quel modo perché nelle dispense del prof erano scritte cosi, ma vedendo il continuo errore del compilatore ho dato un'occhiata su internet e mi sono accorto del grave errore). Non ho ben capito come mi dici di inizializzare il costruttore, cosa fare con la funzione getLen() e la specializzazione tra short e double in C. Abbi un pò di pazienza per favore, devo capire come fare sti esercizi.

link: https://pastebin.com/E2JU2S9q
 
#10

_Achille

Utente Èlite
xjokerx ha detto:
Ciao, allora ho provveduto a spostare il double *w nel protected, credo di aver anche modificato l'array in modo da renderlo dinamico, ho inizializzato la variabile virtuale a 0 (almeno da quello che ho capito una classe si definisce astratta quando c'è una variabile virtual, e per essere pure virtual non deve avere implementazione ma solo la dichiarazione ed essere inizializzata a 0), ho anche corretto la dichiarazione della classe template (l'avevo scritta in quel modo perché nelle dispense del prof erano scritte cosi, ma vedendo il continuo errore del compilatore ho dato un'occhiata su internet e mi sono accorto del grave errore). Non ho ben capito come mi dici di inizializzare il costruttore, cosa fare con la funzione getLen() e la specializzazione tra short e double in C. Abbi un pò di pazienza per favore, devo capire come fare sti esercizi.

link: https://pastebin.com/E2JU2S9q
Per quanto riguarda
-costruttore A: ok, ma inizializza come detto da me
-foo(): esattamente, ma è un metodo di classe non una variabile ;)
-getLen() non fa quello che dovrebbe fare, cioè ritornare semplicemente len. In più dovrebbe essere const e noexcept
-errore mio, w è private ma non puoi usarlo nelle sottoclassi
-get(short i) non è implementato
-altri vari errori, tipo in B che puoi capire con il semplice aiuto del compilatore

C++:
template <class T>
...
T x;
...
if (x == short) //?!??!
/*
Cos'è sta roba? bool T.operator==(x, ?????)
*/
Sfortunatamente il C++ non ha is (come C# ad esempio).
Quindi hai due modi:
C++:
if constexpr(std::is_same_v<short, T>) {
    ...
}
else if constexpr(std::is_same_v<double, T>) {
    ...
}
else {
    ...
}
O template specialization
 
#11

xjokerx

Scusami ma ti leggo solo ora, ti ringrazio, cerco di sistemare e riposto il codice!

Edit
link pastebin : https://pastebin.com/ajQzn02k

Ho messo il link del codice nuovo, ho sistemato qualcosa (almeno credo) ma rimangono ancora delle perplessità:
-riga 8-9: essendo w e len private come li utilizzo nelle altre sottoclassi?
-riga 40: T g(T k), non ho ben capito cosa fa il compilatore in questo caso;
-riga 65: il programma chiede di inizializzare w con m elementi presi a caso tra 0 e 1, uso un generatore casuale, è giusto?
-riga 76: il programma non mi dice cosa fare con getLen(), penso sia per ricevere len, giusto?
-riga 80: costruttore B::B(short m, int x), il costruttore non so che debba fare in questo caso;
-riga 87: nel for il compilatore mi da errore su w e len perché non trova le dichiarazioni che sono private, che faccio?
-riga 101-102: constexpr e is_same_v non mi sono chiare, su internet non ho capito molto, cosa fa di preciso?
-riga 113: implemento T g(T k) cosi: C<T>::g(T k) ma penso sia sbagliato, o no?

p.s. per quanto riguarda il visualizzare la collezione dei 50 elementi con l'overloading di << come devo fare, non mi è per niente chiaro....
 
Ultima modifica:
#12

_Achille

Utente Èlite
xjokerx ha detto:
Scusami ma ti leggo solo ora, ti ringrazio, cerco di sistemare e riposto il codice!

Edit
link pastebin : https://pastebin.com/ajQzn02k

Ho messo il link del codice nuovo, ho sistemato qualcosa (almeno credo) ma rimangono ancora delle perplessità:
-riga 8-9: essendo w e len private come li utilizzo nelle altre sottoclassi?
-riga 40: T g(T k), non ho ben capito cosa fa il compilatore in questo caso;
-riga 65: il programma chiede di inizializzare w con m elementi presi a caso tra 0 e 1, uso un generatore casuale, è giusto?
-riga 76: il programma non mi dice cosa fare con getLen(), penso sia per ricevere len, giusto?
-riga 80: costruttore B::B(short m, int x), il costruttore non so che debba fare in questo caso;
-riga 87: nel for il compilatore mi da errore su w e len perché non trova le dichiarazioni che sono private, che faccio?
-riga 101-102: constexpr e is_same_v non mi sono chiare, su internet non ho capito molto, cosa fa di preciso?
-riga 113: implemento T g(T k) cosi: C<T>::g(T k) ma penso sia sbagliato, o no?

p.s. per quanto riguarda il visualizzare la collezione dei 50 elementi con l'overloading di << come devo fare, non mi è per niente chiaro....
-Forse non sono stato chiaro... https://www.learncpp.com/cpp-tutorial/8-5a-constructor-member-initializer-lists/
-Semplicemente non lo utilizzi. get(short i) non esiste per nulla...
-srand() non va chiamato molteplici volte nel programma. Usa https://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution e non rand()
-riga 40: metodo di classe di nome g che prende un argomento k di tipo T e restituisce un oggetto di tipo T...
-riga 65: credo che a livello universitario (visto che comunque sono in terza liceo io) dovresti sapere cosa succede quando hai
C++:
int x = 1;
...
{
    int x = 5;
    ...
}
//Qui "x" è 5????
Oltre al fatto che è allocazione statica (e pure non possibile visto che m non è conosciuto a tempo di compilazione) e non dinamica.
-riga 77: serio?
-riga 80: chiamata al costruttore della superclasse e inizializzazione di p
-constexpr: valutazione a tempo di compilazione. is_same https://en.cppreference.com/w/cpp/types/is_same. Non è altro che metaprogrammazione
 
#13
Stato
Discussione chiusa ad ulteriori risposte.