| 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: 
 
 Du darfst hierbei aber nicht vergessen, alle Elemente mit delete am Ende wieder freizugeben! 	  | 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.
 }
 | 
 
 Dies ist nur die Grundidee, es gibt noch zahlreiche Verbesserungen / Verschönerungen; z.B:
 
 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. 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!) 
 ...
 
 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: 40
 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 |  | 
	
		|  | 
	
		|  |