[C++] Array di oggetti
Salve, in seguito ad un corso universitario di c++ sto approfondendo da solo la materia. Individualmente sono passato a trattare la programmazione orientata ad oggetti e mi è sorto un dubbio riguardante gli array di oggetti (in particolare utilizzo la libreria ).
Rifacendomi al Monopoli ho implementato una classe madre chiamata casella e delle classi figlie chiamate terreno, stazioni,probabilità ecc... . Ho strutturato il tabellone come un vettore contenente puntatori ad oggetti casella
std::vector Tabellone
Dopo averlo riempito esclusivamente con classi figlie non riesco ad accedere ai metodi e alle variabili (public ovviamente) degli oggetti: gli elementi del vettore, dichiarati come puntatori ad oggetti casella, sembrano impedire la lettura del fatto che di per sè gli oggetti sono specializzati a terreni e non sono soltanto caselle.
Supponiamo che abbia implementato due metodi:
void casella::Stampa(){
std::cout<<"casella"<
}
void terreno::Stampa(){
std::cout<<"terreno"<
}
Le righe di codice
terreno* t1=new terreno;
Tabellone.push_back(t1);
Tabellone[0]->Stampa();
restituiscono come output la scritta "casella".
Ho risolto usando uno static_cast come segue:
static_cast(Tabellone[0])->Stampa();
Tuttavia questo mi sembra un modo molto "artificiale" e mi sa di cosa non pienamente corretta. Qualcuno potrebbe illuminarmi? Grazie in anticipo
Rifacendomi al Monopoli ho implementato una classe madre chiamata casella e delle classi figlie chiamate terreno, stazioni,probabilità ecc... . Ho strutturato il tabellone come un vettore contenente puntatori ad oggetti casella
std::vector
Dopo averlo riempito esclusivamente con classi figlie non riesco ad accedere ai metodi e alle variabili (public ovviamente) degli oggetti: gli elementi del vettore, dichiarati come puntatori ad oggetti casella, sembrano impedire la lettura del fatto che di per sè gli oggetti sono specializzati a terreni e non sono soltanto caselle.
Supponiamo che abbia implementato due metodi:
void casella::Stampa(){
std::cout<<"casella"<
void terreno::Stampa(){
std::cout<<"terreno"<
Le righe di codice
terreno* t1=new terreno;
Tabellone.push_back(t1);
Tabellone[0]->Stampa();
restituiscono come output la scritta "casella".
Ho risolto usando uno static_cast come segue:
static_cast
Tuttavia questo mi sembra un modo molto "artificiale" e mi sa di cosa non pienamente corretta. Qualcuno potrebbe illuminarmi? Grazie in anticipo

Risposte
Da quel che dici sembra che tu non sia arrivato/a al concetto di metodo virtuale.
Per capirci:
Per capirci:
#include <iostream> class casella { public: virtual void print() { std::cout << "casella" << std::endl; } }; class terreno : public casella { public: void print() override { std::cout << "terreno" << std::endl; } }; int main() { casella *a = new casella; casella *b = new terreno; a->print(); b->print(); delete a; delete b; }
Grazie per la risposta. Guardo subito cos' è il metodo virtuale. Una domanda: la scritta "override" è necessaria per dirgli di prendere il posto del metodo di casella o va "in coppia" con il metodo virtuale che deve ancora guardare? Fino ad ora non l' ho usata.
La parola chiave [inline]override[/inline] indica al compilatore che, col metodo che stai dichiarando, hai intenzione di fare un override. Non è necessario specificare [inline]override[/inline] per avere un override, tuttavia, se lo fai, il compilatore verifica che il metodo in questione sia effettivametne un override, e ti avverte in caso contrario. È consigliato usarlo se possibile: [inline]override[/inline] è disponibile in C++11 e successivi.
Se la tua intenzione è di riempire le caselle con sole classe figlie, puoi anche non implementare la funzione virtuale per la classe madre, ovvero usare una funzione virtuale pura:
In ogni caso ti conviene proseguire nello studio del tuo manuale.
class casella { public: virtual void print() = 0; };
In ogni caso ti conviene proseguire nello studio del tuo manuale.
Non ho un manuale. Per il corso in questione ho studiato da appunti e materiale fornito dal prof. Per proseguire i miei studi sto andando un po' alla cieca essendo più un hobby che uno studio vero e proprio. Programmazione just for fun per intenderci. Sarei felicissimo se me ne consigliassi uno ben fatto che si concentri magari più sulla parte oop non trattata a lezione. Grazie!

Sono decenni che non leggo libri di programmazione base in C++. Negli ultimi anni ho più che altro letto libri più specifici, e non ho mai letto nulla di OOP, paradigma che non amo affatto.
Se vuoi una preparazione abbastanza completa suppongo C++ primer https://www.pearson.com/us/higher-educa ... 70560.html oppure lo Stroustup https://www.stroustrup.com/4th.html possano contenere tutto quello che potrebbe servirti e molto di più. Anche se non sono aggiornati agli ultimi standard. Ma gli ultimi standard li puoi anche vedere dopo. Eviterei i libri precedenti al C++11. Non so se faranno delle nuove versioni per il C++20.
Generalmente, quando ho dubbi, vado semplicemente su https://en.cppreference.com/w/ (meglio quella inglese). Se il problema sono solo le funzioni virtuali, qualsiasi tutorial su internet (o video su youtube) dovrebbe fornirti abbastanza informazioni, anche senza libri. E puoi sempre chiedere consigli qui.
Se vuoi una preparazione abbastanza completa suppongo C++ primer https://www.pearson.com/us/higher-educa ... 70560.html oppure lo Stroustup https://www.stroustrup.com/4th.html possano contenere tutto quello che potrebbe servirti e molto di più. Anche se non sono aggiornati agli ultimi standard. Ma gli ultimi standard li puoi anche vedere dopo. Eviterei i libri precedenti al C++11. Non so se faranno delle nuove versioni per il C++20.
Generalmente, quando ho dubbi, vado semplicemente su https://en.cppreference.com/w/ (meglio quella inglese). Se il problema sono solo le funzioni virtuali, qualsiasi tutorial su internet (o video su youtube) dovrebbe fornirti abbastanza informazioni, anche senza libri. E puoi sempre chiedere consigli qui.
Grazie mille dei consigli!
"Super Squirrel":
Magari dai anche un'occhiata qui:
http://www-old.bo.cnr.it/corsi-di-infor ... ndice.html
A occhio mi sembra per-c++11... Dovrebbero aggiornarlo: il c++11 ha cambiato il modo in cui si programma in C++.