OO Fragen

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Vertex

Betreff: OO Fragen

BeitragDo, Dez 30, 2004 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Dez 30, 2004 13:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Dez 30, 2004 13:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Dez 30, 2004 14:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Dez 30, 2004 14:20
Antworten mit Zitat
Benutzer-Profile anzeigen
danke dir, sehr aufschlussreich!
vertex.dreamfall.at | GitHub

Jolinah

BeitragDo, Dez 30, 2004 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

Vertex

BeitragDo, Dez 30, 2004 22:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Dez 30, 2004 22:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Dez 30, 2004 22:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Dez 31, 2004 0:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Dez 31, 2004 2:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

TheShadow

Moderator

BeitragFr, Dez 31, 2004 15:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jan 01, 2005 23:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink.
Don't drink and derive!

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group