Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
boeserZwilling Mini JLI'ler
Alter: 36 Anmeldedatum: 26.08.2007 Beiträge: 11
Medaillen: Keine
|
Verfasst am: 27.12.2007, 14:54 Titel: Scriptsprache ? |
|
|
Liebe Forumsmitglieder,
ich schreib grad an einem Prog das Fördertechnik simuliert. Also Rollenförderer, Lifte, "Drehtische"....... Alle diese Elemente kann man durch Zusammensetzungen von gewissen Grudelementen beschreiben.
z.B.: Rollenförderer = Rahmen + Rollen + Antrieb
Lift = Rollenförderer + weiterer Rahmen(durch Antrieb auf und ab bewegbar) + Antrieb
Drehtisch = Rollenförderer + drehbares Lager + Rahmen + Antrieb
Die meißten Grundelemente existieren schon als Klassen im C++ Code vorhanden. Nun suche ich nach einer Möglichkeit die Klassen von außen anzulegen.
Etwa, dass in einer Datei steht wie ein Element aus Grundelementen zusammengesetzt ist. In einer anderen Datei, dass dieses Element 10 mal hintereinander gesetzt werden soll.
Oder auch eine Konsole in der man zur Laufzeit eintippen kann welches Objekt erstellt werden soll.
Ist es mit einer Scripsprache wie Python möglich auf C++ Klassen-Instanzen anzulegen?
Hat jemand schon Erfahrung mit solchen Problemen und kann mir da eventuell helfen? |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 27.12.2007, 22:07 Titel: |
|
|
ja das ist möglich. Ein gutes Muster dafür ist Vererbung (ggf. mit dem factory pattern). Du musst dafür alle deine Grundelemente (Klassen) von einem (abstrakten) Interface erben lassen. Dann entwirfst du ein Container (z.B. std::list) in dem du diese durch ihren Basisklassenanteil speicherst. Kleines Pseudo-Beispiel:
CPP: | // dein interface
class Grundelement
{
public:
Grundelement();
virtual ~Grundelement(); // virtual wichtig!, ggf. = 0 wenn du keine andere abstrakte Methode hast
protected:
// ggf. standard-Variablen die jedes Gr.el. hat
};
// mehrere spezielle Grundelemente
class Rahmen : public Grundelement {...};
class Rolle : public Grundelement {...};
// etc...
// dein Container, z.B. list
std::list<Grundelement*> mylist;
// dann könntest du durch eingabe, datei etc. (iwas was zur Laufzeit bestimmt) die neuen Objekte einfügen; z.B.
switch( eingabe )
{
case ID_RAHMEN:
mylist.push_back( new Rahmen() );
break;
// etc.
} | Du darfst hierbei aber nicht vergessen, alle Elemente mit delete am Ende wieder freizugeben!
Dies ist nur die Grundidee, es gibt noch zahlreiche Verbesserungen / Verschönerungen; z.B:
- Einfügen der ID in Grundelement, für sicheres Casten (vllt. mit dynamic_cast), sodass du mit element->ID das Element auch ohne casts einordnen kannst
- factory-Pattern: du lässt dir mit einer Methode o.ä. anhand einer ID automatisch das passende Objekt in die Liste einfügen
- Verwenden von smart pointer in der Liste anstatt native pointern du musst die elemente nicht mehr mit delete freigeben (std::auto_ptr funktioniert hier nicht!)
- ...
Das mit der Scriptsprache könntest du dann so implementieren dass du im Endeffekt in dieser switch oben landest und so ein Element zur Laufzeit einfügst.
btw: wenn du boost benutzt könntest du auch auf einen dieser Komponenten zurückgreifen, z.B. boost::any; aber das nur so nebenbei.
Gruß DXer |
|
Nach oben |
|
|
boeserZwilling Mini JLI'ler
Alter: 36 Anmeldedatum: 26.08.2007 Beiträge: 11
Medaillen: Keine
|
Verfasst am: 28.12.2007, 10:27 Titel: |
|
|
Danke,
Feine Sache, ich hab das dank dem JLI Buch schon so gemach. (thing als Basisklasse und dann weitervererbt)
Boost ist mir neu, neben einigen anderen Dingen.
Dann werd ich mal weiterwerkeln und eine Konsole einbauen. |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 30.12.2007, 17:01 Titel: |
|
|
Mit boost:python kannst du super-easy Python Bindings für deine Klassen schreiben und die dann auch von Python und vice versa aufrufen. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
|