Es tut mir leid, wenn meine Frage so lange und technisch ist, aber ich denke, es ist so wichtig, andere Menschen zu interessieren wird esEin allgemeineres Besuchermuster
ich nach einem Weg suchen, eindeutig einige Software-Interna trennen von ihre Darstellung in C++
ich eine generischen Parameter Klasse (später in einem Behälter aufbewahrt werden), die jede Art von Wert mit dem dem boost :: jede Klasse enthält
ich habe eine Basisklasse (grob) von dieser Art (natürlich gibt es mehr Zeug)
class Parameter
{
public:
Parameter()
template typename<T> T GetValue() const { return any_cast<T>(_value); }
template typename<T> void SetValue(const T& value) { _value = value; }
string GetValueAsString() const = 0;
void SetValueFromString(const string& str) const = 0;
private:
boost::any _value;
}
Es gibt zwei Ebenen von abgeleiteten Klassen: Die erste Ebene definiert den Typ und die Umwandlung zu/von string (zB ParameterInt oder ParameterString) Die zweite Ebene, das Verhalten und die reale Schöpfer (zum Beispiel definiert ParameterAnyInt Herleiten und ParameterLimitedInt von ParameterInt oder ParameterFilename von GenericString)
je nach realen Typ würde Ich mag externe Funktion oder Klassen hinzufügen, die auf den spezifischen Parameter je nach Typ arbeitet ohne virtuelle Methoden der Basisklasse hinzufügen und ohne fremde Abgüsse zu tun
Zum Beispiel würde ich wie die richtigen GUI-Controls in Abhängigkeit von Parametertypen zu erstellen:
Widget* CreateWidget(const Parameter& p)
Natürlich kann ich nicht wirklich Parametertyp aus dieser verstehen, wenn ich RTTI verwenden oder es mich selbst implementieren (mit ENUM und Schaltergehäuse), aber dies ist nicht die richtige OOP-Designlösung, wissen Sie.
Die klassische Lösung ist das Visitor-Entwurfsmuster http://en.wikipedia.org/wiki/Visitor_pattern
Das Problem mit diesem Muster ist, dass ich im Voraus wissen, welche Arten abgeleitet werden umgesetzt, so (der Zusammenstellung, was in wikipedia und meinen Code geschrieben ist) wir Art haben:
struct Visitor
{
virtual void visit(ParameterLimitedInt& wheel) = 0;
virtual void visit(ParameterAnyInt& engine) = 0;
virtual void visit(ParameterFilename& body) = 0;
};
gibt es eine Lösung für dieses Verhalten auf andere Weise im voraus alle konkreten Typen und ohne Ableitung des ursprünglichen Besucher zu wissen, ohne die Notwendigkeit zu erhalten?
Edit:Dr. Pizza's solution seems the closest to what I was thinking, aber das Problem ist immer noch die gleiche, und das Verfahren tatsächlich auf dynamic_cast setzt, dass ich als eine Art (auch wenn schwach) RTTI Methode
zu vermeiden versuche, Vielleicht ist es besser, an eine Lösung zu denken, ohne das Besuchermuster zu zitieren und unseren Geist zu reinigen. Der Zweck ist, die nur die Funktion so:
Widget* CreateWidget(const Parameter& p)
verhalten sich anders für jeden „Beton“ Parameter ohne Informationen über seine Art zu verlieren
Schade, dass dieser Artikel verschwunden zu sein scheint: er hat mein Interesse geweckt. Ich nehme an, acht Jahre sind eine Ewigkeit im Internet. – Nicole
@Nicole http://web.archive.org/web/20080517124442/http://www.objectmentor.com/resources/articles/acv.pdf – DrPizza
Vielen Dank! Das ist sehr nett. – Nicole