Background InfoSlicing und Operator C++
ich in Java habe Überlastung in eine Zeit lang Programmierung, und ich habe nur eingeschaltet zu C über ++ nur vor ein paar Monaten, so dass ich entschuldige mich, wenn die Antwort nur etwas Dummes, das ich vermisst habe! Nun, das ist alles gesagt, es ist Zeit für das Problem zur Hand! Ich entwickle eine grundlegende textbasierte Spielengine und bin kürzlich auf ein interessant spezifisches und unwahrscheinliches Problem gestoßen. Ich habe versucht, es in einem kleineren Maßstab im unten stehenden Programm auszuprobieren, und habe mich entschieden, dies (im Gegensatz zu meinem eigentlichen Spielecode) zu zeigen, um den Bildschirm nicht zu ersticken und das Problem weniger verschachtelt zu machen. Das unten modellierte Problem spiegelt das Problem mit meinem tatsächlichen Code wider, nur ohne die flauschigen Distraktoren.
Das Problem
Im Wesentlichen ist das Problem ein Polymorphismus. Ich möchte den Ausgabeoperator "< <" überladen, um als Anzeigefunktion zu dienen, die für jedes Objekt in der Hierarchie eindeutig ist. Das Problem ist, dass wenn ich diesen Operator aus einer Liste herausrufe, die diese Hierarchieelemente speichert, verlieren sie ihre Identität und rufen den Ausgabeoperator der Basisklasse auf. Normalerweise würde man dies lösen, indem man die Operatorüberladungen durch eine einfache Anzeigemethode ersetzt, die Anzeigemethode virtuell markiert und mit dem Happy Day fortfährt. Es macht mir nichts aus, diese Änderung am Code vorzunehmen, aber jetzt bin ich einfach nur neugierig. Gibt es eine Möglichkeit, Operatoren in einer Hierarchie zu überladen, die zu dem führt, was ich hier mache?
Der [Beispiel]-Code
#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;
}
}
Ausgang für [Beispiel]-Code
Polygon!
Polygon!
Polygon!
gewünschte Ausgabe für [Beispiel]-Code
Polygon!
Rectangle!
Square!
Übrigens, das ist eine gute Frage. Die meisten Neulinge stellen solche beschissenen Fragen. – Puppy
als 'Operator <<' ist ein Freund (und kein Mitglied), die kurze Antwort ist nein, Sie benötigen einen internen Display-Operator, der als virtuell markiert ist – vsoftco
Da Sie ein Java-Programmierer sind, wissen Sie, dass dies ein Speicherleck ist C++, wenn Sie den Speicher nicht freigeben: 'listOfPoly.push_back (new Polygon()); ...'Verwenden Sie stattdessen lieber intelligente Zeiger. – PaulMcKenzie