Informazioneaffettare e l'overloading degli operatori in C++
Sono stato di programmazione in Java per un po ', e ho acceso solo verso C++ solo pochi mesi fa, quindi mi scuso se la risposta è solo una cosa stupida che mi mancava! Ora che è stato detto tutto, è giunto il momento di affrontare il problema! Sto sviluppando un motore di gioco di base basato sul testo e di recente mi sono imbattuto in un problema particolarmente specifico e improbabile. Ho provato a testarlo su una scala più piccola nel programma qui sotto, e ho deciso di mostrare solo questo (al contrario del mio codice di gioco effettivo), in modo da non soffocare lo schermo e rendere il problema meno complicato. Il problema modellato di seguito rispecchia il problema con il mio codice effettivo, solo senza i distrattori soffici.
Il problema
Essenzialmente il problema è quello di polimorfismo. Voglio sovraccaricare l'operatore di uscita "< <" per fungere da una funzione di visualizzazione che è univoca per ogni oggetto nella gerarchia. Il problema è che quando chiamo questo operatore da un elenco che memorizza questi membri della gerarchia, perdono la loro identità e chiamano l'operatore di output della classe base. Normalmente, si risolverebbe questo sostituendo i sovraccarichi dell'operatore con un semplice metodo di visualizzazione, contrassegnando il metodo di visualizzazione virtuale e procedendo con il loro felice giorno. Non mi interessa particolarmente apportare questa modifica al codice, ma ora sono semplicemente curioso. C'è un modo per sovraccaricare gli operatori in una gerarchia che risulta in ciò che sto andando qui?
La [Esempio] Codice
#include <vector>
#include <iostream>
#include <string>
using namespace std;
class Polygon {
friend ostream& operator<<(ostream& os, const Polygon& p);
public:
private:
};
class Rectangle : public Polygon {
friend ostream& operator<<(ostream& os, const Rectangle& r);
public:
private:
};
class Square : public Rectangle {
friend ostream& operator<<(ostream& os, const Square& s);
public:
private:
};
ostream& operator<<(ostream& os, const Polygon& p) {
os << "Polygon!" << endl;
return os;
}
ostream& operator<<(ostream& os, const Rectangle& r) {
os << "Rectangle!" << endl;
return os;
}
ostream& operator<<(ostream& os, const Square& s) {
os << "Square!" << endl;
return os;
}
int main() {
vector<Polygon*> listOfPoly;
listOfPoly.push_back(new Polygon());
listOfPoly.push_back(new Rectangle());
listOfPoly.push_back(new Square());
for(Polygon* p : listOfPoly) {
cout << *p;
}
}
uscita per [Esempio] Codice
Polygon!
Polygon!
Polygon!
uscita desiderata per [Esempio] Codice
Polygon!
Rectangle!
Square!
A proposito, questa è una grande domanda. La maggior parte dei neofiti fa domande così schifose. – Puppy
come 'operatore <<' è un amico (e non un membro), la risposta breve è no, è necessario un operatore di visualizzazione interno contrassegnato come virtuale – vsoftco
Dato che sei un programmatore Java, sai che si tratta di una perdita di memoria in C++ a meno che tu non abbia deallocato la memoria: 'listOfPoly.push_back (new Polygon()); ...'Preferisco usare puntatori intelligenti invece. – PaulMcKenzie