OO Fragen
Übersicht

![]() |
VertexBetreff: OO Fragen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was ist der Unterschied zwischen Function und Method in einem Type?
Was ist der Unterschied zwischen einem Attribut als Field und einem als Global im Type? Gibt es Konstruktoren und Destruktoren? Habe es mal so probiert, aber der Destruktor geht ja nicht: Code: [AUSKLAPPEN] Type TMyType
Global X, Y : Int Method Create:TMyType() Return New TMyType End Method Method Free() Delete Self End Method End Type Muss man wirklich immer das Objekt selber übergeben, um es zu löschen? mfg olli Edit: Ok die ersten 2 Fragen haben sich erübrigt. |
||
vertex.dreamfall.at | GitHub |
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Konstruktor ist New()
Destruktor ist Delete() Weder Konstruktor noch Destruktor kann in BB Parameter haben, sie können auch keinen Wert zurückgeben. Sie sind lediglich da um Werte zu Initialisieren oder im Destruktor speicher wieder freizugeben, wobei das nur nötig ist wenn man mit Zeiger und anderen ähnlichen Sachen arbeitet. Normale Eigenschaften werden vom Garbage Collector automatisch vom Speicher entfernt ohne dies im Destruktor manuell machen zu müssen. Wenn man erweiterte Konstruktoren oder Destruktoren will schreibt man am besten statische Funktionen: Code: [AUSKLAPPEN] Type bla
Field a Function Create:bla(default:Int) Local b:bla = new bla b.a = default Return b End Function End Type Local t:bla = bla.Create(10) Print t.a Release t Flushmem |
||
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
OK, ich dachte man kann Konstruktoren/Destruktoren wie bei C++ machen. Es ging mir nur darum, wenn ich z. B. Handles von Bildern oder so im Type speichere, diese dann auch über einen selbstdefinierten Destruktor aus dem Speicher zu löschen.
Muss eigentlich FlushMem immer aufgerufen werden, oder kann ich mein Programm KOMPLETT selber aus dem Speicher entfernen durch Release etc. ? mfg olli |
||
vertex.dreamfall.at | GitHub |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Function gehören nie zu einer Type Instanz sondern zum Type selbst. Dementsprechend werden sie auch aufgerufen
Code: [AUSKLAPPEN] Type Template global value function create:Template() return new Template endfunction endtype test:Template = Template.create Währenddessen können Methods nur auf einer Typeinstanz ausgeführt werden, deswegen können sie auch nicht als Konstruktoren genutzt werden, da der Type schon existieren muss um eine Method ausführen zu können. Bei Field und Global gilt das gleiche: Global gehören dem gesammten Type, existieren also für alle Instanzen des Types nur einmal. Auch auf diesen kann man von aussen direkt mittels Template.value zugreifen ( type intern natürlich direkt mit value ) Währenddessen Field für jede Type Instanz eine eigene Variable darstellt ( zb X,Y koordinaten bei Partikeln und dergleichen ). Und um ein Objekt zu löschen musst du es nicht übergeben, du hast ja mit deinem Free() schon gezeigt wie es gemacht werden kann. Self ist eine Referenz auf das auslösende Objekt. test:TMyType = new TMyType test.free funktioniert also problemlos, nur musst du noch ein Flushmem irgendwo unterbringen in deinem Programm ( häufig wirds am ende der hauptschleife gemacht ), damit das Objekt aus dem System entfernt wird. Release markiert ein Objekt nur zur Freigabe aus dem System. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
danke dir, sehr aufschlussreich! | ||
vertex.dreamfall.at | GitHub |
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: Delete - Reserved for future expansion
Glaube nicht das es mit delete funktioniert. Oder doch? Mit Release sollte es aber gehen, nur weiss ich nicht ob das in Verwendung mit Self funktioniert. Edit: Release Self funktioniert nicht ![]() |
||
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe es mal so gemacht (nur ein Test):
Code: [AUSKLAPPEN] Type TMyType
Global iCount:Int = 0 Field iXPosition:Int Field iYPosition:Int Field hImage:TImage Function Construct:TMyType(sFile:String = "default.jpg") Local tInstance:TMyType = New TMyType tInstance.iXPosition = 0 tInstance.iYPosition = 0 tInstance.hImage = LoadImage(sFile) iCount=iCount+1 Return tInstance End Function Function Destruct(tInstance:TMyType) Release tInstance.hImage Release tInstance iCount=iCount-1 End Function Method SetXPos(iXPos:Int) iXPosition = iXPos End Method Method SetYPos(iYPos:Int) iYPosition = iYPos End Method Method Draw() DrawImage hImage, iXPosition, iYPosition End Method End Type Graphics 640, 480, 32 Print MemAlloced() tTest:TMyType = TMyType.Construct() tTest.SetXPos 10 tTest.SetYPos 20 tTest.Draw Print MemAlloced() Flip TMyType.Destruct(tTest) Print MemAlloced() WaitKey ; End Jedoch muss man anscheinend FlushMem wirklich in den Destruktor mit einbringen, was natürlich scheiße ist. Ist es jetzt so, das FlushMem nur alle Objekte die mit Release gekennzeichnet wurden, aus dem Speicher löscht? mfg olli |
||
vertex.dreamfall.at | GitHub |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Jolinah: es ist als erlaubt aufgeführt unter Userdef types
Vertex: Nein es wird alles gelöscht, was nicht mehr verwendet wird ( also wo keine referenz mehr darauf existiert ). Flushmem würde ich zudem nur 1x pro mainloop laufen lassen, sonst könnte der garbage collector zu nem performance problem werden, je nachdem wie er genau funktioniert. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ist ja aber scheiße, wenn ich nicht eine Instanz via Delete gleich herauslöschen kann. Das fand ich bei Blitz Classic besser mit den ganzen Free-Befehlen. | ||
vertex.dreamfall.at | GitHub |
![]() |
DivineDominion |
![]() Antworten mit Zitat ![]() |
---|---|---|
Habe das "Release self" auch angesprochen, im englischen Forum, da es eben nur so über eine temporäre Referenz möglich ist und ich das komisch fand.
Nahegelegt wurde mir dann, dass eine Methode die eigene Instanz nicht löschen soll, die passenden Argumente für diesen Tipp fehlen aber noch. Vielmehr soll ich eine function nehmen, wie du das da schon gemacht hast. Sei angeblich sonst eine Designschwäche und sowas, darum ginge das wohl nicht und es sei auch gut so... Ach ja, global kann man auch in Funktionen nutzen! Ist das das selbe wie Static in C++! Code: [AUSKLAPPEN] Function f( )
Global statisch:Int statisch :+ 1 Return statisch End Function For Local i:Int = 0 To 10 Print "f(): " + f() + " -> var: " + statisch + "?" next |
||
christian.tietze@gmail.com - https://christiantietze.de
macOS |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das System von Blitzmax ist nunmal managed nicht und nicht mehr so "schludrig" und memory leaky wie Blitz3D darum geht auch Delete nicht, dann würde der Garbage Collector viel zu viele Ressourcen fressen ( darum ist eine free funktion die release flushmem macht auch ziemlich schwachsinn in den meisten fällen, da dann der ressourcenmanager die meiste rechenzeit verschlingen wird bei anwendungen die viele dynamische daten haben wie ein partikel system zb ) | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
flushmem sollte man doch nicht in einer schleife ausführen - das wäre ja fatal. Normal macht man sowas z.B. wenn ein Level geladen wurde oder bei neuem Spiel... In alten BB's konnte man z.B. 1 Mio. Types anlegen - dann löschen. Der Speicher wurde dann aber nicht mehr freigegeben... Das war eine Schwachstelle... | ||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
Demon |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zitat: Nahegelegt wurde mir dann, dass eine Methode die eigene Instanz nicht löschen soll, die passenden Argumente für diesen Tipp fehlen aber noch.
Das wäre auch irre, wenn das gehen würde. Du würdest praktisch das Objekt löschen, wo der Code drin ist, den du gerade ausführst. So, als wenn du dir den eigenen Ast absägst, auf dem du sitzt ![]() |
||
Don't drink and derive! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group